plucker-1.8/0040755000076400001440000000000010052675417012055 5ustar mickeusersplucker-1.8/FAQ0100644000076400001440000004443007636606444012421 0ustar mickeusers ============================================================================== Frequently Asked Questions about Plucker ============================================================================== Last modified: $Date: 2003/03/21 13:01:24 $ If your question is not there, please check the Plucker home page http://www.plkr.org which may have more recent information. 1 - Introduction 1.1 What is Plucker? 1.2 In what way is Plucker different from AvantGo? 1.3 Where can I get Plucker? 1.4 Is there a mailing list for Plucker? 1.5 Is there an anonymous cvs server? 1.6 What is the status of Plucker? 1.7 Where can I send bug reports? 1.8 How can I contact the Plucker team? 2 - Installation 2.1 What platforms does Plucker run on? 3 - Usage 3.1 How does Plucker work? 3.2 Why can't I see any pictures on my Palm device? 3.3 I have all the necessary tools, but I still can't see any pictures? 3.4 Why do pages with images show [img 4bpp] instead of images? 3.5 The protocol is missing when the parser attempts to download a page? 3.6 How do I pluck a password-protected site? 4 - Configuration 4.1 How do I configure the parser to create ZLib compressed databases? 5 - Development 5.1 Why does make only build the viewer application but never the ZLib library? 5.2 Where can I get zlib? 5.3 Where can I get prc-tools? 5.4 Why is the so messy? 6 - Miscellaneous Questions 6.1 Can you suggest some good web pages for Plucker? 6.2 What are some of the features of Plucker? 6.3 What features does Plucker not implement? 6.4 What other features can we expect? 6.5 Where can I find Plucker eBooks? ============================================================================== *-*-*-*-*-*-* Introduction: *-*-*-*-*-*-* 1.1 What is Plucker? -------------------- Plucker is a suite of programs which provide an off-line web browser for Palm OS systems (see below for compatibility). It's free software under the conditions of the Free Software Foundation's General Public License, so you can copy, change, or even sell this program without giving anyone any money, as long as you make the source code (and your changes, if any) publicly available. We would, of course, be interested to see any changes you might make and possibly include them in a future release of Plucker. There's lots of things that could be done better! In many ways, the ideas of Plucker are similar to the proprietary AvantGo software, though we believe that the implementation of Plucker is utterly different from AvantGo. According to their web page, AvantGo implements an HTML parser on the Palm device; Plucker implements the majority of the parser on the PC/server/desktop machine. There are probably situations where AvantGo would be far more appropriate than Plucker (online browsing, for example), however, you need an SDK to work with AvantGo. 1.2 In what way is Plucker different from AvantGo? -------------------------------------------------- The programs differ in many ways. Most importantly (to us, at least), Plucker is Free software, distributed under the FSF's General Public License. This means that if you are using Plucker, you are entitled to the source code, and you can change it to make it do whatever you want (as long as you make the changes publicly available). Other differences that we know of include: o AvantGo parses compressed (read: "encrypted") HTML on the Palm device itself; Plucker parses uncompressed HTML on the server, and sends an interpreted version to the Palm. o Plucker appears to render documents faster (though it hasn't been optimized for speed, really) o The "home" Plucker page is a user-defined HTML document, and is treated just like any other. The "home" AvantGo page does not appear to be HTML; it's determined by the AvantGo configuration software. So, the history buttons don't work from the Home page in AvantGo. o Plucker will support DND HTML files. AFAIK, AvantGo does not. 1.3 Where can I get Plucker? ---------------------------- Visit the Plucker home page at http://www.plkr.org/ The development versions ("the latest snapshot") are usually very stable themselves, so if you want access to all the latest features (and have the development tools installed) you can safely go with these versions. As always, remember to backup any unsaved data before you start playing with the development version. 1.4 Is there a mailing list for Plucker? ---------------------------------------- Yes. The list for Plucker users, plucker-list, is a fairly low traffic list. The developers list, plucker-dev, is intended for focused development discussion amongst the core Plucker development team. Of course, anyone is welcome to read. The Plucker Announce list is where new releases are announced. If you are only concerned with releases, this is the list for you. To join: visit http://lists.rubberchicken.org/ and select the list(s) you want to subscribe to. Archives for plucker-list and plucker-dev can be found at, http://www.mail-archive.com/plucker-list%40rubberchicken.org/ http://www.mail-archive.com/plucker-dev%40rubberchicken.org/ http://lists.rubberchicken.org/ 1.5 Is there an anonymous cvs server? ------------------------------------- Yes there is. To check out the code from cvs you first have to login, cvs -d :pserver:anonymous@cvs.plkr.org:/cvs/plucker -z3 login and then just hit ENTER at the password prompt. Check out the code with: cvs -d :pserver:anonymous@cvs.plkr.org:/cvs/plucker -z3 co plucker 1.6 What is the status of Plucker? ---------------------------------- Plucker is in a beta state. While you're more than welcome to take Plucker for a spin, it might not work for you. It works for us, but we don't know what you've got installed on your machines that may be different from that installed on ours. You might lose all the data on your PalmPilot, you might need to reboot your machine, it might never be the same again. Beware! 1.7 Where can I send bug reports? --------------------------------- Fill out the file BUGREPORT in the Plucker distribution and send it to plucker-bugs@rubberchicken.org (really), or fill out the forms located at http://bugs.plkr.org/ and we'll do our best to fix them as soon as we can! 1.8 How can I contact the Plucker team? ---------------------------------------- Send a message to plucker-team@rubberchicken.org . Unlike the mailing list you don't have to be a subscriber to post to this address. However, general questions about Plucker should still be sent to the mailing lists. *-*-*-*-*-*-* Installation: *-*-*-*-*-*-* 2.1 What platforms does Plucker run on? ----------------------------------------- The viewer should run on any Palm OS device utilizing version 2.0.4 or higher of Palm OS, while the desktop tools are supported on Linux, Windows, Mac OS X, and OS/2. The desktop tools will probably work on any Unix system with Python installed, but your mileage may vary, so don't get angry if they don't work. If you are able to get it running on a system not listed in REQUIREMENTS then please let us know so that it can be added to the list of supported systems. *-*-*-* Usage: *-*-*-* 3.1 How does Plucker work? -------------------------- Plucker consists of three parts: the parser, the conduit, and the viewer. The parser and the conduit have been merged into one complete Python version and eventually there will also be a Perl versions of the parser. The standalone conduit is written in Perl and there is also a conduit written in Delphi for the Windows users. The parser runs on your main computer (the one with the HotSync cradle or IR port physically attached to it, or on a networked machine which allows you to connect to it via Network Hotsync). It gathers the web pages you specify and follows the links on those pages to a certain depth (specified by you). You specify the web pages you want to gather by creating a "home.html" file, which also becomes your home page. The links on "home.html" are followed to a depth specified by the optional "MAXDEPTH" attribute which you can include in the tag in the home.html file. The parser finds new links to retrieve and also converts the pages to a format that the viewer can read. The conduit takes the converted HTML files from a directory or from your computer's system memory (RAM; using the python parser) and places them in a database on your Palm device, or directs them to a file (which is the same as the database) on your desktop, which you can sync to your emulator or your "real" Palm device at a later time. The viewer displays the converted HTML files on your Palm device's screen. It allows you to use the stylus to tap on links which will then display the target page. It has a 32-page history, so you can move backwards and forwards through the pages just as you would with your desktop browser. Rendering is done in part by the parser (which works out things like which styles to use) and in part by the viewer (which works out line and document lengths, and renders nchors). 3.2 Why can't I see any pictures on my Palm device? --------------------------------------------------- Either you have an old version of Plucker (image support was added in version 0.03) or you haven't installed all necessary tools. The Palm device uses a format called Tbmp (Tiny Bitmap) for its images, and the parser in Plucker needs (among others) a special tool called ppmtoTbmp to be able to convert images to the Palm OS bitmap format (depending on your version of Plucker, you may no longer need to use the ppmtoTbmp tool. It has recently been replaced by the netpbm2 package). Check out the REQUIREMENTS file in the main source archive for a list of necessary tools and where to find them. 3.3 I have all the necessary tools, but I still can't see any pictures? ------------------------------------------------------------------------- Make sure that you don't set a too high value for MAXWIDTH. Anything above 150 pixels (default value) for embedded images will give the result that no images are shown. 3.4 Why do pages with images show [img 4bpp] instead of images? ------------------------------------------------------------------------- When you generate 2 or 4 bpp images you have to change the bit depth of the screen to view them. The default depth is 1 (Black/White), so when the viewer finds images of a higher bit depth it will display [img Nbpp] instead (N = bit depth for the image). You change the bit depth in the Preference dialog. 3.5 The protocol is missing when the parser attempts to download a page? ------------------------------------------------------------------------- Even if you don't tell us what OS you are running we would be very surprised if it's not Red Hat 7.0, 7.1, or 7.2. There is a bug in the python version (1.5.2) include with Red Hat 7.0, 7.1, and 7.2. A solution provided by Joe A. can be found at http://home.earthlink.net/~joefefifo/plucker/fix.html A more detailed discussion of the problem can be found at http://home.earthlink.net/~joefefifo/plucker/fix_detailed.html 3.6 How do I pluck a password-protected site? ---------------------------------------------------------------------- We suggest using Sitescooper together with Plucker to pluck various hard-to-get-at sites. Sitescooper has many features for pulling over pages that will be slow to appear in Plucker. For more information on Sitescooper, see www.sitescooper.org. 3.7 I'd like to use Plucker for (books, reports, etc.) which I sell. Is there any way to protect a Plucker document from theft? ---------------------------------------------------------------------- Plucker documents can be built with an 'owner-id', which must correspond to the HotSync ID on a Palm for the document to be opened on that Palm. This is similar to the document-locking schemes used by many commercial sites. Use the --owner-id switch on the parser to do this. *-*-*-*-*-*-*-* Configuration: *-*-*-*-*-*-*-* 4.1 How do I configure the parser to create ZLib compressed databases? ---------------------------------------------------------------------- By setting the compression key in the configuration file (.pluckerrc for Unix/Linux, plucker.ini for Windows and OS/2) to zlib the parser will use ZLib instead of DOC compression for the databases. You can always change this behavior at run-time by using the --zlib-compression or the --doc-compression options. *-*-*-*-*-*-* Development: *-*-*-*-*-*-* 5.1 Why does make only build the viewer application but never the ZLib library? ------------------------------------------------------------------------------- You didn't read the README in the viewer dir, did you? The zlib package must be downloaded separately and put in viewer/ZLIb *before* attempting to configure Plucker. 5.2 Where can I get zlib? ------------------------- You can download zlib from its home page at http://www.gzip.org/zlib/ Put the package in viewer/ZLib before you run configure. 5.3 Where can I get prc-tools? ------------------------------ prc-tools 2.x can be downloaded at: http://prc-tools.sourceforge.net/ 5.4 Why is the so messy? ----------------------------------- Well, the old legacy parser (a bunch of awk scripts) was only a temporary solution and have been replaced with a Python-based parser. That should make it easier to comprehend what it actually does! We believe that the rendering of documents for the Palm device should be specialized, so we intend to continue to render the documents in the parser/viewer. If you haven't looked at the viewer since 0.02 then you would probably be surprised. The single source file of version 0.02 has been split up in several files and the viewer is approaching being optimal, but there are some issues, particularly with implied structure coupling, and lack of documentation, both of which we wish to address. The conduit is not clever. It will upload pages to the database even if they already exist and have not changed. This should obviously be fixed so that a full 360 degree synchronization process can be achieved. *-*-*-*-*-*-*-*-*-*-*-* Miscellaneous Questions: *-*-*-*-*-*-*-*-*-*-*-* 6.1 Can you suggest some good web pages for Plucker? ---------------------------------------------------- In the appendix of the User's Guide you'll find a collection of links to some good web pages for Plucker. 6.2 What are some of the features of Plucker? --------------------------------------------- o Plucker is designed for off-line browsing on a small screen. It doesn't attempt to make HTML pages look like they appear on a monitor; instead, it tries to make them readable and useful. o The history buttons always work, even from the home page. o You can scroll nicely with the scroll buttons or the pen. o On-screen indication of visited links. o Image support o Named anchors (such as ) o Very impressive compression of records to save space on the device. o Support for multiple databases and multiple versions of the same content. o Search function for current page and all pages in a database o Bookmarks o Possible to copy URLs to a memo o E-mail support o There are dozens more features not listed here, go ahead and give Plucker a go, and try them all out for yourself. 6.3 What features does Plucker not implement? --------------------------------------------- The following is a (non-exhaustive) list of unimplemented features. Apart from frames, we intend to include this functionality in the future: o Frames (it might be possible to implement this in a links kind of way by rendering and converting the frames to tables, much like the links browser). o Document titles are not currently uploaded to the Palm device. o Various HTML tags (e.g. , , etc) are not supported o Javascript, DHTML, Java, CSS 6.4 What other features can we expect? -------------------------------------- Here is a list of other ideas for Plucker. No promises! A TODO list sorted both by category and by date can be found on the Plucker developer's page. o We intend to integrate Plucker with the popular free desktop managers (namely, KDE and the Gnome). In these environments it would be great if you could Drag-'n'-Drop a URL into the Palm device for off-line viewing. o The ability to modify parameters, such as the maximum link depth, from the Palm device, so that the next HotSync will retrieve more/less data. o The ability to "send" a web page from the Palm device to an internet mail address. o Cron-based gathering of HTML pages, prior to a HotSync (to significantly reduce HotSync time). o Parallel gathering/parsing/conduit (to reduce HotSync time). o Smart gathering/conduit; only update a document if it's actually changed. (Reduce hotsync time). o Compatibility with AvantGo's .subs files, and the .site files that a similar product SiteScooper reads. Of course, if you want to help add these (or other) features, feel free to implement them. 6.5 Where can I find Plucker eBooks? ------------------------------------ Apart from the samples you can find at the Plucker web site, there are other sites that have eBooks as well. Memoware has a growing collection of Plucker eBooks submitted by contributors and users of Plucker. http://www.memoware.com/cgi-bin/mwsearch.cgi?Any=plucker You can also find several Plucker eBooks at Byron Collins' site http://home.clarksville.com/~bcollins/index.htm Curt 'n' Dave's Plucker-book Repository http://www.pluckerbooks.com/ Nick Vargish's Bandersnatch Unpress http://melissa.nfr.net/~nav/unpress/ The "Linux Documentation Project" (LDP) now releases all its HOWTOs and mini-HOWTOs in Plucker format. They are located under the 'Additional HOWTO-related items' at the following url:: http://www.linuxdoc.org/docs.html#howto or http://ibiblio.org/pub/Linux/docs/LDP/pluckerdb plucker-1.8/os2/0040755000076400001440000000000010052664563012560 5ustar mickeusersplucker-1.8/os2/RADAR.ICO0100644000076400001440000000760006753274367013761 0ustar mickeusersBA(xCI @CI BA(CI (PCI@ ((mU!!!ccc$$U$$IIUIImmU111mUUU۪RRRUsss++U+++$+$U+$+$+I+IU+I+I+m+mU+m+m++U++++U++++U+۪+++U++UUUUUU$U$UU$U$UIUIUUIUIUmUmUUmUmUUUUUUUUUUUUUU۪UUUUUUU)))$$U$$IIUIImmUmmUUU۪UU$$U$$IIUIImmUmmUUU۪UU$$U$$IIUIImmUmmՒՒUՒՒննUննU۪UJJJUkkk$$U$$IIUIImmUmmUUU۪ZZZU{{{:::BBB??a???pwpwwwpwpwpwpxwwxwwwpwxwppwxpwpwxwpxxxwwwxxxxxwwxwwxpwwxpwp?8??plucker-1.8/os2/NEWS.ICO0100644000076400001440000000462006751113043013660 0ustar mickeusersBA(xCI @CI BA(CI (PCIp ((???xpxxxpxxxpxpxxppxpwxpxxw?????pwpwwpwppwpwxpwpxppxpxpwpwwwwxwwpwwwwwpplucker-1.8/os2/Recreate.cmd0100755000076400001440000000476407027216505015007 0ustar mickeusers/* ReXX */ /* * $Id: */ /* Create Plucker Object on Desktop */ Call RxFuncAdd "SysLoadFuncs","RexxUtil","SysLoadFuncs" Call SysLoadFuncs Parse ARG installdir Port '@Echo OFF' if installdir = "" then installdir = Directory() env = 'OS2ENVIRONMENT' /* homedir = VALUE('HOME', , env) */ /* Python can't handle driveletters, so home has to reside below the * actual Python-Conduit. We assure this by setting HOME explicitly * via hotsync.cmd */ homedir = installdir || '\parser\python'; /* Create Folder on desktop */ rc=SysCreateObject("WPFolder","Plucker^for OS/2","","OBJECTID=") if rc then do say "Plucker-folder created sucessfully" end else say "Plucker-folder could not be created: "||rc rc=SysSetObjectData("","ICONFILE="||installdir||"\os2\DOKUMENT.ICO;ICONNFILE=1,"||installdir||"\os2\DOKUMEN1.ICO") /* Place the necessary objects in the folder */ rc=Directory(installdir) CurrentDir=Directory() FileName=CurrentDir||"\parser\python\hotsync.cmd" ExeName="EXENAME="||FileName||";ICONFILE="||CurrentDir||"\os2\plucker.ico;STARTUPDIR="CurrentDir||"\parser\python" If SysCreateObject("WPProgram","Plucker Hotsync","",ExeName) then do Say "Desktop Object for Plucker was created." End FileName=CurrentDir||"\parser\os2\irhotsync.cmd" ExeName="EXENAME=pilot-xfer.exe;Parameters=-p [IR-Port?] -i "||homedir||"\.plucker\Plucker.pdb;ICONFILE="||CurrentDir||"\os2\radar.ico;STARTUPDIR="CurrentDir||"\parser\os2" If SysCreateObject("WPProgram","Plucker IR-Hotsync","",ExeName) then do Say "Desktop Object for IR-Plucker was created." End ExeName="EXENAME=E.EXE;PARAMETERS="||homedir||"\.plucker\home.html;ICONFILE="||installdir||"\os2\news.ico" If SysCreateObject("WPProgram","Plucker Channels", "", Exename) then say "Homepage-Object created" ExeName="EXENAME=netscape.exe;PARAMETERS=http://www.rubberchicken.org/products/plucker;ICONFILE="||installdir||"\os2\netscape.ico" If SysCreateObject("WPProgram","Home of Plucker", "", ExeName) then say "Link created" Exename="EXENAME=pilot-xfer.exe;PARAMETERS=-i "||homedir||"\.plucker\PluckerDB.pdb;ICONFILE="||installdir||"\os2\Tricode.ico" If SysCreateObject("WPProgram","Transfer data only","",ExeName) then say "Sync-Object created" Exename="EXENAME=e.exe;PARAMETERS="||installdir||"\README.OS2;ICONFILE="||installdir||"\os2\CWPROJEC.ICO" If SysCreateObject("WPProgram","Readme^for OS/2","",ExeName) then say "Readme added" Exit plucker-1.8/os2/DOKUMEN1.ICO0100644000076400001440000000642006751113042014266 0ustar mickeusersBA(xCI @CI ???BA(CI  CI` ???BA(hCI (PCI` ((BA(CI (CI ????|pwwwwppxxppppppppppgp??????????????'wwwwwwrpwwpwwwwpwwwwwwwwpwwwwxwwwwwwwwwwwxppp0 0 ?s333xxxx}wwwwppplucker-1.8/os2/DOKUMENT.ICO0100644000076400001440000000642006751113042014331 0ustar mickeusersBA(xCI @CI ???BA(CI  CI` ???BA(hCI (PCI` ((BA(CI (CI ????|pwwwwppppgxp??????????????'wwwwwwrpwwpwwwwpwwwwwwwwpwwwwxwwww珈wwwwwwwhppp00 ?wwwp~p~~~pplucker-1.8/os2/CWPROJEC.ICO0100644000076400001440000001672006751113041014322 0ustar mickeusersBA(HCI @CI tttmUdddUU$+UmUm$mIU$UUUIUI$U++++$+IU$+$+I+UI+I+I+m+Um+m+m++U++++U++++U+'''UI666...+>>>FFFMMMUUUUU$UU$U$U$UIUUIUIUUUUUmUUmUUmUUUUUUUUUUUUUUUUUUUUU]]]lll|||U$U$$$IUIIImUmm+UU+ۀUۀۀۀUU$U$$$IUIIImUmmm+۪U۪۪۪UUժ$U$ժ$$IUIժIImUmժmmUժUժU+Um+U$U$$$IUIIImUmmmUUUm$BA(CI (PCI ((                                     ???????dddttttttdddtttdddUtttdddtttdddttttttUUUUttttttddddddUUժUUtttdddtttUժUUtttddddddժUUtttdddtttUUUUUUUUtttddddddUUUUUUUUUtttdddtttUժttttttddddddժUttttttժddddddtttdddttttttmUmUttttttdddtttdddtttmUmUttttttmUmUU$+mUmUmUdddtttmUmUmUU$+mUmUmUmUmUU$+mUmUmUdddtttmUU$+mUmUtttdddU$+mUdddtttU$+U$+tttdddU$+U$+U$+U$+dddttttttdddmUmUmUmUmUmUmUmUmUmUplucker-1.8/os2/INSTALL_OS2.CMD0100755000076400001440000000755007027216505014702 0ustar mickeusers/* ReXX */ /* Create Plucker Object on Desktop */ /* * $Id: */ Call RxFuncAdd "SysLoadFuncs","RexxUtil","SysLoadFuncs" Call SysLoadFuncs Parse ARG installdir Port lang '@Echo OFF' 'cls' if installdir = '' then call help if Port = '' then Port = 'COM1' if lang = '' then lang = 'en' env = 'OS2ENVIRONMENT' /* homedir = VALUE('HOME', , env) */ /* Python can't handle driveletters, so home has to reside below the * actual Python-Conduit. We assure this by setting HOME explicitly * via hotsync.cmd */ homedir = installdir || '\parser\python'; say "Welcome to Plucker!" say "~~~~~~~~~~~~~~~~~~~" say "" say " ---o-o--- This installation-routine will"; say " ---o--o-- install Plucker for OS/2 distribution,"; say " ---o-o--- that is:"; say " ---o----- - the scripts necessary to run Plucker"; say " ---o----- - the viewer to your Palm"; say " - the files needed in your home"; say " It will not install the programs Plucker"; say " needs as system requirements."; say " Especially it will not install Perl and Pilot-Link."; say ""; say " Currently running OS: OS/2"; say " Communicating via : "||Port; say " Using as HOME : "||homedir; say " Language of viewer : "||lang; say "" 'pause' say "" say "Now copying files..." say "" 'xcopy ..\*.* '||installdir||'\*.* /S > nul 2> nul' 'md '||homedir||'\.plucker >nul 2>nul' 'md '||homedir||'\.plucker\cache >nul 2>nul' 'md '||homedir||'\.plucker\html >nul 2>nul' 'xcopy ..\parser\defaults\*.* '||homedir||'\.plucker\*.* /S /E > nul 2> nul' say "" say "All files copied, now creating Desktop-objects for Plucker..." say "" rc=Directory('installdir') /* Create Folder on desktop */ Call Recreate.cmd installdir /* Install the viewer using Pilot-Link */ Say "I'll now install the viewer to your Palm-device" if lang='en' then viewer=installdir||"\viewer\binary\English\viewer.prc" if lang='de' then viewer=installdir||"\viewer\binary\Deutsch\viewer.prc" 'pilot-xfer -p '||Port||' -i '||viewer||' ' say "" say "Viewer should be installed properly." say "Ok, now displaying the README.OS2, containing further" say "instructions. Have a lot of fun..." say "" say " Created by Alexander Wagner, Team OS/2 Franken" say " -=[ We know where we want to go today ]=-" say "" say " In case of emergency" say " mailto: a.wagner@teamos2.de" call readme /* display help */ help: say " Usage:" say "~~~~~~~~" say "" say " ---o-o--- This installation-routine will"; say " ---o--o-- install Plucker for OS/2 distribution,"; say " ---o-o--- that is:"; say " ---o----- - the scripts necessary to run Plucker"; say " ---o----- - the viewer to your Palm"; say " - the files needed in your Home"; say " It will not install the programs Plucker"; say " needs as system requirements."; say " Especially it will not install Perl and Pilot-Link."; say " "; say " Install_OS2 " say "" say " represents the path to which you want to install" say " the plucker package." say " e.g. E:\PalmPilot\Plucker" say " represents the COM-Port you Palm is connected to." say " If no port is specified COM1 is assumed by default." say " e.g. COM1" say " specify the language of the viewer. Currently supported:" say " en : English" say " de : Deutsch" say "" say "Using this a correct call of this script might be" say "" say "Install_OS2 E:\PalmPilot\Plucker COM1" say "________________________________________________" say "" say "" say " Created by Alexander Wagner, Team OS/2 Franken" say " -=[ We know where we want to go today ]=- " say "" say " In case of emergency" say " mailto: a.wagner@teamos2.de" say "" say "" say " To requirements of this package see README.OS2" say " Opening README.OS2 and exiting..." readme: 'start /F e '||installdir||'\README.OS2' Exit plucker-1.8/os2/TRICODE.ICO0100644000076400001440000001212006751113043014167 0ustar mickeusersBA(H^CI @CI ۪IImUmmm$U$UUU+U+++$+U$+$+$+I+UI+I+I+m+Um+m+m++U++++U++++U++++U+++UUUUU$UU$U$U$UIUUIUIUIUmUUmUmUmUUUUUUUUUUUUUUUUUUUUUUUU$$U$$$IUIIImUmmm'''...666>>>FFFMMMUUU]]]dddlllttt|||$IUUۀUۀۀۀUU$U$$$IUIIImUmmmUU۪U۪۪UIUUժ$U$ժ$$IUIժIImUmժmmUժUժUժUժUUU$U$$$IUIIImUmmmUUBA(CI (PCI ((mU!!!ccc$$U$$IIUIImmU111mUUU۪RRRUsss++U+++$+$U+$+$+I+IU+I+I+m+mU+m+m++U++++U++++U+۪+++U++UUUUUU$U$UU$U$UIUIUUIUIUmUmUUmUmUUUUUUUUUUUUUU۪UUUUUUU)))$$U$$IIUIImmUmmUUU۪UU$$U$$IIUIImmUmmUUU۪UU$$U$$IIUIImmUmmՒՒUՒՒննUննU۪UJJJUkkk$$U$$IIUIImmUmmUUU۪ZZZU{{{:::BBB??????????????????????xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzxxxxzzzzzzzsstsstsswxzzzzzzzzztzzzxxxstxxxz~~~szxxxssxx~~~szpxzsxx~szzztxxsz~~~szzxxzsxx~tszzzzztswxzstsssssstxxtzsz~zzxx~~zzxxszzxxszszzzszzzxxt~zzwxs~~zzxxszszz~zzxxt~zzxxsszzzxxszszzzxxszzwxszzxxszzzszzzxxszzzzzxxszzzzzzzzzzzzzxxstsstsssststzzxzzzzzzzz@rWOrrrrOZ# ????????????,,,,,,,,,,rr,,,,,,,,,,,r,,,,rr,////,,////,, p,,////,, p,,/,, ,,,r,////,,,,,/r,,,,,,rr,rr,rrr,,/,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,r/,,,//,,,,,,/,,,,,,/,,,r/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,rrrr,,,,,,,,,,,,,,,plucker-1.8/os2/plucker.ICO0100644000076400001440000000577206751113043014562 0ustar mickeusersCI: (PCI ((...̪UUU>>>آ'''ddd胃|||]]]mUm$UUmIU$UIU$+$+$+$+I+UI+I+I+m+Um+m+m++U++++U++++U+++UI$U++UMMMFFFUUUU$UU$U$U$UIUUIUIUIUmUUmUmUmUUUUUUUUUUUUUUUUUUUUUժllltttU$U$$$IUIIImUmmUI666ۀUۀ+ۀ+ۀUUU+U$U$$$IUIIImUmmmU+U۪U۪۪۪UU+Uժ$U$ժ$$IUIժIImUmժmmUժUժUժUm+m$U$U$$$IUIIImUmmmUUUUU~<                            plucker-1.8/os2/NETSCAPE.ICO0100644000076400001440000002432006751113042014304 0ustar mickeusersBA(xCI @CI BA(CI (CI BA(8CI (PCI ((@ @ @@@@@`@```@@@@ @ @ @ @@ @ @ ` @` ` ` @ @ @ @ @@@@@ @@ @ @ @@@@@@@@@@`@@`@`@`@@@@@@@@@@@@@@@@@@@@@`@``` `@ ` ` `@`@@`@`@```@```````@````@````@````@```@ @ @@@@@`@```@@@@@ @ @@@@@`@```@@@@ࠀ@ @ @@@@@`@```@@@@@ @ @@@@@`@```@@@@BA(CI  @CI  @@mU!!!ccc$$U$$IIUIImmU111mUUU۪RRRUsss++U+++$+$U+$+$+I+IU+I+I+m+mU+m+m++U++++U++++U+۪+++U++UUUUUU$U$UU$U$UIUIUUIUIUmUmUUmUmUUUUUUUUUUUUUU۪UUUUUUU)))$$U$$IIUIImmUmmUUU۪UU$$U$$IIUIImmUmmUUU۪UU$$U$$IIUIImmUmmՒՒUՒՒննUննU۪UJJJUkkk$$U$$IIUIImmUmmUUU۪ZZZU{{{:::BBBwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwx wwwwwwwwwwwwwwPwwwwwwwwwwwPwwwwwwwwww݈Pwwww}ݍPP؈XP݀_P P݀]XP׍ PXP݈ P P݀XPP׀ }PXP}}P} }}}}P}w}}]}]}}}}}w}w}}}w}wwwwwwwwxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwx0ww7wws3333733333?333s383333738333733?333?3383333?33s33800?380308p @@``@@@ @@ `` @ @ @@@ @@@@@``@@@@@@@@@@`` `@@```@```@```@ @@``@@@ @@``@@@ @@``@ ۶ے RRR..RRRRRR   RRRR.R.RRRRR .  ۶RRRRRRRRRRR.....R.RRRRRRRRRRRRRRR.R.R.............RRRRRRRRRR................... ....... R ........ .. ..............R .. . ....... .. .... . ...  .R..... ... . . ...R .. .. . .. . . . . . .. . . . . . .. . R .. . .  R R . . ..R .    .. R       .     R .     ..    .      ..    .      .      .  RR.ے                    plucker-1.8/NEWS0100644000076400001440000006106410052665143012553 0ustar mickeusersNEWS for Plucker veterans ------------------------- - 1.8 User stuff: * i-mode support (Dave Maddock) * The 5-way support in the library has been changed. (Michael Nordstrm) New behaviour: - If the list of documents is only one page then the fiveway will be activated from the beginning. - If the displayed list of documents includes the last accessed document then the fiveway will be activated. - The select/centre button will activate the fiveway and the initially selected document will be the last accessed document or if that document isn't visible the document at the middle of the page will be selected. When the fiveway is activated the select/centre button will open the selected document. - The up/down button will either scroll the list one page up/down (when the fiveway isn't activated) or select the previous/next document in the list (when the fiveway is activated). - The left button will deactivate the fiveway or if the fiveway isn't activated it will exit the viewer. When the list of documents is only one page pressing left will exit the viewer instead of deactivate the fiveway. - The right button will display the popup list with different actions for the selected document (when the fiveway is activated). When the fiveway isn't activated the right button will not result in any action. * The following preferences have been removed, - "Enable dynamic scrollbar"; always disabled. - "Enable visual aid"; always enabled. - "Click sound for links"; always enabled (i.e. it uses the setting for "system sound"). * Faster rotation. (Alexander Pruss) * Faster anti-aliased fonts on 68K. (Alexander Pruss) * Support for (slow) colored anti-aliased text in 8bpp. (Alexander Pruss) * Anti-aliased fonts now work with colored backgrounds. (Alexander Pruss) * Support for font remapping via font package. (Alexander Pruss) * Italic font support. (Alexander Pruss) * Kerning for antialiased fonts. Requires version 0.70+ of PalmFontConv. (Alexander Pruss) * Font packages can be put on VFS either in /Palm/Launcher/ or in /Palm/Programs/Plucker/Fonts/ (Alexander Pruss) * You can now tap on a word to either put the word in the search form or to look it up in a dictionary. (Alexander Pruss) * Added Plucker Plugin Interface (PPI) to configure the interface with third-party dictionary programs. (Chris Hawks) * Added Catalan translation (Albert Cuesta) * Added Norwegian translation (Geir-Tore Lindsve) * Added option to select whether the sort by date should use only the date or if it should use both date and time (faster, but could make the list look 'unsorted'). (Michael Nordstrm) * The external card support will be disabled when the device detects a low power situation to avoid errors when trying to access the card through VFS. (Michael Nordstrm) * External bookmarks support in viewer. (Dave Maddock) * When the library is sorted by name, you can select a document by entering the first couple of characters. (Alexander Pruss) * The parser when using the Python Imaging Library will now automatically reduce the depth of black-and-white images to 1-bit, thereby decreasing file size. (Alexander Pruss) * Drop-in transliteration module support added, and built-in transliterations removed. (Alexander Pruss) * Full support for DIA on Handera, Sony and PalmOS 5.2+ units, including landscape if the hardware supports it. (Alexander Pruss) * Full support for Dana AlphaSmart wide and tall modes. (Alexander Pruss) Development stuff: * Support for unit test using PalmCUnit (http://www.rickandviv.net/palmcunit.html) (Michael Nordstrm) - 1.6 User stuff: * Support for anti-aliased fonts. To convert outline fonts to Plucker format, you may need things from palmfontconv.sourceforge.net * Keyboard customization support. (Alexander Pruss) * Added support for continuous viewing of more than 32K of text. (Alexander Pruss) * Sped up rendering. (Alexander Pruss) * Added display rotation. (Alexander Pruss) * Added multiple term search. (Alexander Pruss) * Added search armlet. (Alexander Pruss) * AxxPac support (Angel Ivan Moreno) * Handspring JogDial support (Rod Whitby) * Handspring 5-way pad support (Michael Nordstrm) * Support for online access to external links on Treo600 (Michael Nordstrm) * Preference option to enable/disable soft-hyphens; some languages use the same keycode for a normal character (Michael Nordstrm) * Win32 script for handling POST requests in Plucker and also an Outlook VBA macro to extract Plucker URLs (Jahn Rentmeister) Development stuff: * Changed the type and handling for several config options (Michael Nordstrm) * Removed ZLib directory and will include either M68K or Armlet version of the SysZLib.prc in the viewer package (depending on the configuration used for the viewer.) * Included Justin Clark's armlet port of SysZLib.h. - 1.4 * Changed checkbox option to update document list manually into a selection list with options to manually update list, automatically update documents in RAM and external cards, or only in RAM (Michael Nordstrm) * The viewer will "remember" the category settings also for documents on an external card that has been removed (Michael Nordstrm) * Hires support (Adam McDaniel) * New Document Library (Adam McDaniel) * I18N support (Masakazu Matsumoto) * Next/prev anchor support (Josef Hajas) * Added Thai translation (Karin Pimsamsee) Development stuff: * Added linked list feature; will be used for anchor handling, cache, etc. (Michael Nordstrm) * The viewer will accept beamed documents (Michael Nordstrm) * Possible to use build directories for the viewer (Michael Nordstrm) * Removed support for the now obsolete A4 based version of prc-tools (Michael Nordstrm) - 1.2 User stuff: * One-click selection of category (Masakazu Matsumoto) * Support for inlined images with a larger width than max line width (Masakazu Matsumoto) * Added man pages for plucker-decode, plucker-dump, plucker-setup and pluck-comics (Michael Nordstrm) * Support for sorting the databases according to name, date or size in both ascending and descending order (Michael Nordstrm) * Support for strikethrough text ( and ) (Michael Nordstrm) * The date used in the memo with the copied URLs will now be in the ISO format (Chris Hawks) * Support for alignment attribute in paragraph tags (Nick Vargish) * Support for Visor's Flash Module (Michael Nordstrm with help from David Martin to test it) * Narrow font added to the viewer (Michael Nordstrm using font created by Robert O'Connor) * Support for gestures, i.e. the user can specify actions for the up, down, right, left and tap gestures, similar to button actions (Robert O'Connor) * Added Danish translation (Claus Hindsgaul) * Added Simplified Chinese translation (Danny Zeng) * Added Polish translation (Tomasz Wjcik) * Added Russian translation (Oleg V. Krulikovsky) * Added Spanish translation (Gustavo Broos) * Added Turkish translation (Tufan Oruk) * Narrow fixed font (Robert O'Connor) * Autoscroll support (Robert O'Connor) * Color and greyscale icons for toolbar (Robert O'Connor) * Support for preformatted text (i.e. the
 tag)
    (Michael Nordstrm)

  * The default category of a document will be added to
    the list of categories if it's not already available
    and there is a free position in the list, otherwise
    the document will be assigned to Unfiled. Also made
    it possible to assign several default categories 
    separated by ';'  (Michael Nordstrm)

  * Added 
parser support for size, align, and width (pixel and %) (Robert O'Connor) * Added document name to Details (Michael Nordstrm, after a suggestion from Byron Collins) * If no Plucker documents are available the viewer will go to the Document Library (instead of showing an alert an exit). (Michael Nordstrm) * Optional owner-id protection added to Plucker documents, so that they will only open on a device with a matching owner-id. (Bill Janssen) * VFS support added. The viewer will look for Plucker documents in /Palm/Programs/Plucker/, /Palm/Ebooks/, and /Palm/Launcher/ (Michael Nordstrm) * Added word-wrap on a hyphen (Jamis Buck) * Added option to set default launcher category for the viewer (Michael Nordstrm) * Added option to update document list manually (Michael Nordstrm) Development stuff: * Bug fix to avoid activating the control buttons during pen movements (Michael Nordstrm) * Added new target, dist-manual, which will create a tar package for the HTML manual (Michael Nordstrm) * Changed the layout of the viewer's source code (Michael Nordstrm) * Added new configure options that can be used to disable the building of the Palm apps and/or the documentation (Michael Nordstrm) * Added maintainer's Makefile used to build and release new packages. Note that if you use the code direct from CVS you have to run "make VERSION=" to include a version string. (Michael Nordstrm) * Added spec file for RPM package. (Michael Nordstrm) * Configure script will check for more image tools and also select the default image parser (Bill Janssen) * Changed debug printouts to use POSE's HostControl API (Max Bian) * Added debug printouts to memo when running on PalmOS device (Michael Nordstrm) * Removed TRG SDK requirement (not necessary after VFS support was added). (Michael Nordstrm) * Applied patch found on the PalmZLib Sourceforge page. It adds a few checks for NULL pointers. (Michael Nordstrm) - 1.1 User stuff: * Preference option to change the standard font (Michael Nordstrm) * Added possibility to jump to bookmarks from View Bookmarks dialog (Michael Nordstrm) * Added menu options for jumping to top and bottom of document (Michael Nordstrm) * Added possibility to move forward/backward using the DateBook/Addresses buttons (Uwe Mssel) * Added menu option to remove all databases for the selected category/categories in the DB Manager (Michael Nordstrm) * Added French translation (Andy Rabagliati, Laurent Pasquer and Nicolas Huillard) * Added Japanese translation (Masakazu MATSUMOTO) * Added Faeroese translation (Jacob Sparre Andersen) * Optimized the DB manager (Michael Nordstrm) * More command toolbar options (Dirk Heiser) * Added support for Basic Proxy Authorization (Dirk Heiser) * Support for large images (Chris Hawks) * New arguments added to the parser for the image handling (Michael Nordstrm) * When turning off the scrollbar the extra space will be used for the rendering of the text (Michael Nordstrm) * The parser will now use the environment variable PLUCKERDIR if it is defined (Michael Nordstrm) * Added pluck-comics, a tool to gather comics from selected websites (Chris Hawks) * The name of the database will be shown in the category form (Chris Hawks) * Possible to configure all four hardware buttons for different actions (Michael Nordstrm) * Improved image support in the Python parser (Bill Janssen) * Initial support for beaming Plucker databases from the DB manager. On a TRGpro it is possible to beam databases from the CF card. (Michael Nordstrm) * Added confirmation dialogues to delete bookmarks and categories. (Michael Nordstrm) Development stuff: * Added auto-detection of toolchain to configure scripts (Michael Nordstrm) * Changed all viewer code to Kernighan & Ritchie coding style with the indentation level to 8 spaces (Michael Nordstrm) * Replaced "hard-coded" screen depth handling with a more general solution (Michael Nordstrm) * Command bit is set for menu key event (Michael Nordstrm) * Added support for OS4 (Dirk Heiser) * Changed the configure script so that it only checks for the dev tools and the ZLib package if the cross-compiler has been found. (Michael Nordstrm, after a suggestion from Adam Spiers) * Added new target, dist-simple, which will create a zip package including the English version of the viewer, the ZLib shared library and the User's Guide as a Plucker document (Michael Nordstrm) * Fixed a few memory leaks (Michael Nordstrm) - 1.0 User stuff: * Support for command toolbar in PalmOS 3.5 (Dirk Heiser) * Category support in DB Manager (Michael Nordstrm) * Possible to copy URLs to the clipboard (Chris Hawks) * Support for ZLib compressed databases (Michael Nordstrm) * Support for BASE tag in documents (Bill Janssen) * Improved table support (Bill Janssen) * New config file option to suppress compression of small images, no_image_compression_limit (Dirk Heiser) * New flag (and config file option) to set the default category, --category (Michael Nordstrm) * Support for underline tags (). When it is activated in the preference all links will be indicated using the dotted line. Use the strike-through option to still be able to distinguish visited and unvisited links. (Michael Nordstrm) * Man page for the parser (Bill Janssen) Development stuff: * New record added to store references to the URL records, see PluckerDB.html for details. (Chris Hawks) * The ZLib support uses the PalmOS shared library that Tom Zerucha has created. This library will also work with Boxer (written by Tom), http://www.palmboxer.com/ . More info about the library is available at http://palmzlib.sourceforge.net/ * Added support to config files for both prc-tools-2.0 and prc-tools-0.6.0 (Michael Nordstrm) * New database format that should allow us to expand the format in the future without rendering previous versions obsolete, see PluckerDB.html for details. (Michael Nordstrm) * Fixed a (harmless) bug in the session handling that has gone unnoticed for a very long time. (Michael Nordstrm) * Changed the handling of Show images, so that there will still be a "[img]" tag when you choose to not show images. Previously, nothing was displayed which made it impossible to use image links. (Michael Nordstrm) * The ConfigFiles.py file now makes sure that the default value, if specified, is of the correct type. It also abstracts out the operation of looking up the option in the configs, to a new method, _get_string, which does not take an option. (Bill Janssen) * Fix to avoid Palm OS bug in bitmap compression (Michael Nordstrm) * Fix to avoid buffer overflow for long database names (Michael Nordstrm) * Fix to avoid problems with AutoCF when searching in databases located on the CF card (Michael Nordstrm) * Fix to avoid Palm OS bug in DmSetDatabaseInfo (Michael Nordstrm) * Other bug fixes (Michael Nordstrm) - 0.9 User stuff: * Support for databases in Flash (Michael Nordstrm) * Support for large images (scroll the image using the pen) (Michael Nordstrm) * New preference option to set the screen bit depth (Michael Nordstrm) * The viewer will automatically set the required bit depth for the screen (if the depth is supported by the device) for Tbmp documents, i.e. not documents with inlined images (Michael Nordstrm) * Added session control for the search options (case sensitive, search in page or all pages) (Michael Nordstrm) * Added "history" for search patterns (Michael Nordstrm) * Italian version of the viewer (Daniela Di Candia) * The image text will now indicate the bit depth (Michael Nordstrm, after a suggestion from Alexander Wagner) * Pop-up dialog for a small image that is both a link to a large version of the image and to a page (Michael Nordstrm) * Moved the option for pen scrolling from Preferences to the Tap Action (Michael Nordstrm) Development stuff: * Bug fixes: memory leak (under some very rare conditions) in uncompress handling, etc. (Michael Nordstrm) * Major changes to database format separating the static and dynamic data (Michael Nordstrm) * It is now possible to place objects at different locations for the supported languages (Michael Nordstrm) * Database version changed to 9 and other databases will be rejected (Michael Nordstrm) * New format for mailto tag records (Chris Hawks) * Added depth status for each document (Michael Nordstrm, idea from Holger Drer) - 0.8 User stuff: * Possible to use databases that have been beamed or installed using InstallBuddy (Michael Nordstrm) * Alert when you try to open a databases in flash ROM (Michael Nordstrm) * Config file for the python parser (Holger Drer) Development stuff: * Bug fixes (NULL handlers, memory leaks etc.) (Michael Nordstrm) * Each record now also contains a unique ID that is used for finding the correct record (Michael Nordstrm after an idea from Ondrej Palkovsky) * The viewer will now create a separate database for the uncompress handling (Michael Nordstrm) * Major changes to the database format, changed the UID for some records and the first two bytes of a record will always contain the UID for the record (Michael Nordstrm) - 0.7 User stuff: * Table based database manager added (Michael Nordstrm) * Fullscreen mode added (Michael Nordstrm) * Possible to have the toolbar either at the top or the bottom of the page (Michael Nordstrm) * Included file with different Palm (and Plucker) friendly sites, links.html * Support for new alignment option, justify. (Chris Hawks) * Improved handling of low memory conditions (Michael Nordstrm) * Support for mailto tags (Chris Hawks) * Support for OS 3.1+ OpenDB command (for Launcher III, etc) (Dirk Heiser) * Re-wrote the code that added support for different screen depths, it should now support the highest available screen depths for the device it is running on. (Michael Nordstrm) * Rename database option added to database manager (Michael Nordstrm) * System sound (click) when tapping on control objects or links. (Michael Nordstrm) Development stuff: * Bug fixes (rendering problems, search in uncompressed documents, etc.) (Michael Nordstrm) * Record #3 (error.html) has been removed from the viewer. (Michael Nordstrm) * Code updated for SDK3.5 (Michael Nordstrm) - 0.6 User stuff: * A warning if record #1, #2 and/or #3 are missing replaces the warning for wrong version. (Michael Nordstrm) * If any important records are missing (except for #1, #2 and #3) they will be created automatically. (Michael Nordstrm) * If the last viewed database is found to be broken when the viewer is started it will alert the user about this and display the database manager. (Michael Nordstrm) * Show images option added to details dialog. (Michael Nordstrm) * Find function (Michael Nordstrm) * Czech version of the viewer (Ondrej Palkovsky) * Support for 2bit greyscale images (Michael Nordstrm, using info&code available at http://www.astraware.com/program/palm/snippits.html. Thanks to Dirk Heiser for providing the URL.) * Location in the current document (in %) included in the header. (Chris Hawks) * Tap on percentage and get a pop-up list (top, 10%, 20% ... 90%, bottom) used to jump inside the document. (Michael Nordstrm) * Scrollbar can be placed at the left/right side or be removed. (Michael Nordstrm) * New icon in header to enable quick access to database manager. (Chris Hawks) * New icon in header to enable quick access to find/find again. (Chris Hawks) * Database manager is now using a normal list instead of a pop-up list. (Michael Nordstrm, Chris Hawks) * Database Info option added to database manager form. (Chris Hawks) Development stuff: * New structure for the language support (Michael Nordstrm) * Configure scripts will now require that the m68k-palmos tools are in the user's path. It will also be possible to configure and build the viewer in a separate directory. (Michael Nordstrm) * Many bugs fixed (Michael Nordstrm) - 0.5 User stuff: * Support for compression of database. (Michael Nordstrm, Holger Drer) * Details dialog making it possible to mark a read document as unread. More stuff will be added to this dialog later on. (Michael Nordstrm) * Support for alignment, margins ad new line should make it possible to replicate the document closer to the original. (Michael Nordstrm) * Italic font (Michael Nordstrm) * Horizontal rule (Michael Nordstrm) * Multi-database support (Michael Nordstrm) * Warning if no database exists or if a database has the wrong version. (Michael Nordstrm) * No underlining of images, where appropriate. (Michael Nordstrm) * Scrollbars (Michael Nordstrm) * Named anchors support (Michael Nordstrm, Holger Drer) * Strike-through option for visited links (Michael Nordstrm) * Python based parser (Ondrej Palkovsky, Holger Drer) * LaTeX and HTML versions of documentation (Alexander Wagner) * Preferences (Menu-hack, strike-through) (Michael Nordstrm) * Control options to set different behavior for different regions of the screen. (Michael Nordstrm) * Menu-hack, i.e. tap on title to open menu. (Michael Nordstrm) Development stuff: * Disassembly tool (Holger Drer) * Improved debug support through serial port (Michael Nordstrm) * Documents and images are now uncompressed using a 4k buffer and two different records. Should decrease the required amount of dynamic memory. (Michael Nordstrm) * Function descriptions added to all functions in the source code. (Michael Nordstrm) * Guidelines for the coding conventions used in the viewer added. (Michael Nordstrm) * Several bug corrections (Michael Nordstrm) * API documentation (Michael Nordstrm) - 0.04 Internal version - 0.03 User stuff: * Inline and linked image support! (Mark Lillywhite) * Visited links are now indicated by a gray underline. (Michael Nordstrm) * Session management. (Michael Nordstrm) * Some international characters are now supported. If you have information about problems please let us know. Thanks to Michael Nordstrm and Andreas Gaufer. * The page-up and page-down keys now scroll 100 pixels, instead of 20. The use of the pen to scroll the screen remains unchanged. (Jiva DeVoe) * If you tap somewhere in the top half of the screen, the page scrolls down. If you tap somewhere in the bottom half, the page scrolls up. (Jiva DeVoe) * Now accepts links starting with "file:" (Mark Lillywhite) * Perl based conduit (Alexander Wagner) * OS/2 support for desktop tools, see README in parser/os2 (Alexander Wagner) * wget replaces lynx for downloading web pages (future versions of Plucker will replace wget with perl, see below) * Changes in PluckerDB structure, so any PluckerDB created with 0.02 won't work * The downloaded HTML pages are now placed in ~/.plucker/html, please make sure that this directory exists if you are upgrading from an earlier version of Plucker. Development stuff: * The source file has been split up. There is now a *.c and *.h file for most of the "objects" in the viewer. Hopefully this will make the structure a bit easier to figure, though probably not :) * If you define DEBUG and DEBUG_SERIAL, then you can write debug messages to the serial port. (It doesn't work all that great, but it's better then what we had before!). Other stuff: * There is work proceeding apace on a new parser, written in Perl, which should make Plucker much easier to use. * Many bugs fixed - 0.02 This is a really small update to plucker. It attempts to make the viewer run on PalmOS units other than PalmOS 3; it appears to work on PalmOS 2.5, and it's possible it will now run on PalmOS 1. I've also made some very small changes to Plucker with thanks to suggestions from Mark Seaborn. He's reported getting plucker working on a very early Pilot. I'm not sure the precompiled version will work; you might need to get the pilot tools and make some changes to viewer.c (or you might not). -- 0.01 Original release. The Plucker Team plucker-team@rubberchicken.org plucker-1.8/docs/0040755000076400001440000000000010052675407013004 5ustar mickeusersplucker-1.8/docs/Parser.tex0100644000076400001440000012406207712230706014762 0ustar mickeusers% % $Id: Parser.tex,v 1.15 2003/07/31 15:12:06 desrod Exp $ % \chapter{The Parser}\label{sec:Parser} As pointed out in the previous chapter the parser is more or less the workhorse of Plucker. This implies that most customizations are done to the parser and that the parser covers a rather big part of this manual. \section{Description file}\label{sec:Home Page} Before we take a closer look at the parser itself, we will describe the format of the description file also known as the Home Page document (default \name{home.html}, but that can be changed). On a Unix/Linux system this file will be stored by default in \name{\$HOME/.plucker}. OS/2 will use the environment-variable \textit{HOME} to find the location of your home-directory (you can also use drive letters). The installer should set the necessary environment variable for you and also add the necessary directories to your system. You may check the location by simply typing \code{set home} at a command prompt.\\ The description file is a valid HTML document with extra optional tags added for the link references. \begin{itemize} \item \longcode{description file}{MAXDEPTH=n}: This specifies how deep the parser should follow the links embedded in a web page. If \code{MAXDEPTH} is not given the parser will default to a depth of 1, that is only download the page itself but do not follow any links in it. To follow links in the current page you would use \code{MAXDEPTH=2} and to follow links also in those pages you would use \code{MAXDEPTH=3} and so on. Too high values without using any of the available filtering mechanisms could result in an excessive amount of data. \hint{} \code{MAXDEPTH=2} can be very useful if you have a page that contains only the headlines that are links to the full text version of the articles. Many newstickers use this format. \item \longcode{description file}{NOIMAGES}: If you are not interested in downloading images then you use this tag. If specified all images will be replaced with the ALT-tag for the image if available, otherwise \textbf{[img]}. \hint{} \code{NOIMAGES} is an effective way to decrease the size of documents. \item \longcode{description file}{STAYONHOST}: Most web sites contains references to both locally stored articles and to articles stored on other hosts. Using a \code{MAXDEPTH} of 2 or higher could result in a lot of unwanted data. To prevent this you may specify the \code{STAYONHOST} tag for your link. The parser will now only download content that resides on the same server as the one that contained the top page. Together with \iname{exclusionlist.txt} this is a quite handy way to prevent the download of links referred to by banners. \item \longcode{description file}{STAYBELOW=\emph{text}}: Similar to \code{STAYONHOST} this tag tells the parser to only fetch pages that start with \emph{text}. For example, it could be used if the articles on a page are listed on another server in which case \code{STAYONHOST} would not work properly. Or you can grab certain articles out of a large listing so you would get all headlines but only articles referring to specific subjects (provided the web server offering the information is set up \emph{correctly}). \note If \emph{=text} is not given, it will default to the content of the href-attribute (the URL you are pointing to). \item \longcode{description file}{BPP=n}: This option is used to specify the bit depth that should be used for images. Valid values are 0 (i.e.\ no images), 1, 2, 4, and 8. \note{} \code{BPP=8} is currently only supported when the parser is used on a Windows system. \item \longcode{description file}{MAXWIDTH=width}: Used to set the maximum width of images. \item \longcode{description file}{MAXHEIGHT=height}: Used to set the maximum height of images. \end{itemize} An simple example of a description file is: \begin{verbatim} Plucker Home Page
Plucker home page \end{verbatim} This would download the front page of our web site and also follow any links on the page if they are local to the host. No images would be downloaded.\\ The description file (\name{home.html}) that is installed when your Plucker directory is set up, also contains a few examples.\\ \section{Invoking the parser} As the previous section showed, you can specify several options specific for each reference in the description file and many times this is enough. But additionally, the parser provides some global control through powerful command-line options and also a possibility to use different configurations that have been set up in the config file.\\ In all the examples below we will call \name{Spider.py} directly. This could be stored in a script or we could create a symbolic link to it, e.g.\ if you have installed the Linux package you would use \name{plucker-build} instead of \name{Spider.py} in the examples. A note for OS/2 and Windows users: running \name{Spider.py} as an executable program is a Unix trick and may not work on your platform. But do not worry, just list the \name{Spider.py} on an explicit \name{python} command line, that is use \code{python Spider.py \ldots} instead. The synopsis of the parser look like this:\\ \begin{latexonly} \begin{tabular}{lp{15cm}} \ioption{Spider.py} & \option{\mbox{-c}\textbar \mbox{-{}-update-cache}\textbar \mbox{-f FILE}\textbar \mbox{-{}-doc-file=FILE} [\mbox{-N NAME}\textbar \mbox{-{}-doc-name=NAME}] [\mbox{-h}\textbar \mbox{-{}-help}]} \\ & \option{[\mbox{-{}-compression=TYPE}\textbar \mbox{-{}-zlib-compression}\textbar k \mbox{-{}-doc-compression}] [\mbox{-P DIR}\textbar \mbox{-{}-pluckerhome=DIR}]}\\ & \option{[\mbox{-v}\textbar \mbox{-V NUM}\textbar \mbox{-{}-verbosity=NUM}] [\mbox{-q}\textbar \mbox{-{}-quiet}] [\mbox{-{}-bpp=NUM}] [\mbox{-{}-noimages}] [\mbox{-p DIR}\textbar \mbox{-{}-pluckerdir=DIR}]}\\ & \option{[\mbox{-H URL}\textbar \mbox{-{}-home-url=URL}] [\mbox{-M DEPTH}\textbar \mbox{-{}-maxdepth=DEPTH}] [\mbox{-E FILE}\textbar \mbox{-{}-exclusion-list=FILE}]}\\ & \option{[\mbox{-s SECTION}\textbar \mbox{-{}-extra-section=SECTION}] [\mbox{-{}-no-urlinfo}] [\mbox{-{}-stayonhost}] [\mbox{-{}-staybelow=URLPREFIX}] [\mbox{-{}-category=CATEGORY}]} \end{tabular}\\ \end{latexonly} \begin{htmlonly} \index{Spider.py} \end{htmlonly} \begin{rawhtml} Spider.py -c | --update-cache | -f FILE | --doc-file=FILE [-N NAME | --doc-name=NAME] [-h | --help] [--compression=TYPE | --zlib-compression | --doc-compression] [-P DIR | --pluckerhome=DIR] [-v | -V NUM | --verbosity=NUM] [-q | --quiet] [--bpp=NUM] [--noimages] [-p DIR | --pluckerdir=DIR] [-H URL | --home-url=URL] [-M DEPTH | --maxdepth=DEPTH] [-E FILE | --exclusion-list=FILE] [-s SECTION | --extra-section=SECTION] [--no-urlinfo] [--stayonhost] [--staybelow=URLPREFIX] [--category=CATEGORY] \end{rawhtml} Do not run away in fear of all these options, you don't have to use all of them\ldots actually, you only have to use \textbf{one} of them (and that can be reduced to none if you set the file name of the document in the configuration file --- more about that later).\\ \begin{latexonly} You can always get the list of the parameters by using the \longoption{Spider.py}{-h} or \longoption{Spider.py}{-{}-help} option. \end{latexonly} \begin{htmlonly} You can always get the list of the parameters by using the \longoption{Spider.py}{-h} or \longoption{Spider.py}{---help} option. \end{htmlonly} \subsection{Control Over the Result}\label{sec:ParserOutput} \begin{latexonly} The \longoption{Spider.py}{-c}, \longoption{Spider.py}{-{}-update-cache}, \longoption{Spider.py}{-f}, and \longoption{Spider.py}{-{}-doc-file} options allows you to specify if the parser should dump all records in a cache directory or if it shall create a document. For example, the command, \end{latexonly} \begin{htmlonly} The \longoption{Spider.py}{-c}, \longoption{Spider.py}{---update-cache}, \longoption{Spider.py}{-f}, and \longoption{Spider.py}{---doc-file} options allows you to specify if the parser should dump all records in a cache directory or if it shall create a document. For example, the command, \end{htmlonly}\\ \indata{\% Spider.py -c}\\ \begin{latexonly} tells the parser to dump all records in the cache directory in \code{\$PLUCKERDIR} using the default description file (as you will see below it is possible to change the default description file in Plucker's config file). The \option{-{}-update-cache} option works the same way as \option{-c}. \end{latexonly} \begin{htmlonly} tells the parser to dump all records in the cache directory in \code{\$PLUCKERDIR} using the default description file (as you will see below it is possible to change the default description file in Plucker's config file). The \option{---update-cache} option works the same way as \option{-c}. \end{htmlonly}\\ If we instead used the following command,\\ \indata{\% Spider.py -f PluckerDB}\\ \begin{latexonly} the parser would create a document called \name{PluckerDB.pdb} and store it in \code{\$PLUCKERDIR}. The \option{-{}-doc-file} option works the same way as \option{-f}. Either \option{-c} or \option{-f} must be given unless the document has been specified in the configuration file (see \~ref{sec:ConfigFile}). The name of the document will default to the same as the name given to \option{-f}. If you want to give the document a different name, you can use the \longoption{Spider.py}{-N} or \longoption{Spider.py}{-{}-doc-name} option, \end{latexonly} \begin{htmlonly} the parser would create a document called \name{PluckerDB.pdb} and store it in \code{\$PLUCKERDIR}. The \option{---doc-file} option works the same way as \option{-f}. Either \option{-c} or \option{-f} must be given unless the document has been specified in the configuration file (see \~ref{sec:ConfigFile}). The name of the document will default to the same as the name given to \option{-f}. If you want to give the document a different name, you can use the \longoption{Spider.py}{-N} or \longoption{Spider.py}{---doc-name} option, \end{htmlonly}\\ \indata{\% Spider.py -f PluckerDB -N "Home Page"}\\ This will still create a document called \name{PluckerDB.pdb} in \code{\$PLUCKERDIR}, but the name of the document (i.e.\ the name you would see on your Palm) would now be \name{Home Page}.\\ The file name given to the \option{-f} option can contain an absolute or relative path, so if we run,\\ \indata{\% Spider.py -f /home/pilot/.plucker/DB/PluckerDB}\\ a document called \name{PluckerDB.pdb} will be stored in \name{/home/pilot/.plucker/DB} and if we run,\\ \indata{\% Spider.py -f DB/PluckerDB}\\ a document called \name{PluckerDB.pdb} will be stored in \name{\$PLUCKERDIR/DB} (the same as above since \code{\$PLUCKERDIR} in this case defaults to \name{/home/pilot/.plucker/})\\ To save space on the device all records are compressed and the parser provides two different types of compression, DOC compression and ZLib compression. The ZLib compression gives the best compression, but is only available for Palm OS 3.0 and later devices and also requires a shared library.\\ \begin{latexonly} You control the compression type by using the \longoption{Spider.py}{-{}-compression=TYPE} option. Allowable options are `doc', for Palm DOC compression, or `zlib', for zlib compression. You can also use the \longoption{Spider.py}{-{}-zlib-compression} or the \longoption{Spider.py}{-{}-doc-compression} option. If neither is given the parser defaults to DOC compression. \end{latexonly} \begin{htmlonly} You control the compression type by using the \longoption{Spider.py}{---compression=TYPE} option. Allowable options are `doc', for Palm DOC compression, or `zlib', for zlib compression. You can also use the \longoption{Spider.py}{---zlib-compression} or the \longoption{Spider.py}{---doc-compression} option. If neither is given the parser defaults to DOC compression. \end{htmlonly}\\ \begin{latexonly} To put the document in a specific category by default you can use the \longoption{Spider.py}{-{}-category} option. It is possible to give several default categories separated by ";". \end{latexonly} \begin{htmlonly} To put the document in a specific category by default you can use the \longoption{Spider.py}{---category} option. It is possible to give several default categories separated by ";". \end{htmlonly} \subsection{Status Information and Debugging} \begin{latexonly} The parser normally outputs errors and progress status to your terminal, but by using the \longoption{Spider.py}{-q}, \longoption{Spider.py}{-{}-quiet}, \longoption{Spider.py}{-v}, \longoption{Spider.py}{-V} or \longoption{Spider.py}{-{}-verbosity} option you can change this. The \option{-V} (and \option{-{}-verbosity}) takes an argument, \end{latexonly} \begin{htmlonly} The parser normally outputs errors and progress status to your terminal, but by using the \longoption{Spider.py}{-q}, \longoption{Spider.py}{---quiet}, \longoption{Spider.py}{-v}, \longoption{Spider.py}{-V} or \longoption{Spider.py}{---verbosity} option you can change this. The \option{-V} (and \option{---verbosity}) takes an argument, \end{htmlonly} \begin{enumerate} \item[0] silent, except for errors. \item[1] progress status (default), will list the page currently being plucked as well as some output from the image converters. \item[2] produces a lot of output about the gathering and parsing process, used for debugging. \end{enumerate} \begin{latexonly} The \option{-v} option sets verbosity level 1, while \option{-q} and \option{-{}-quiet} set verbosity level 0. \end{latexonly} \begin{htmlonly} The \option{-v} option sets verbosity level 1, while \option{-q} and \option{---quiet} set verbosity level 0. \end{htmlonly} \subsection{Description filenames} \begin{latexonly} The \longoption{Spider.py}{-H} or \longoption{Spider.py}{-{}-home-url} option allows you to specify a different description file than the default one. For example, the command, \end{latexonly} \begin{htmlonly} The \longoption{Spider.py}{-H} or \longoption{Spider.py}{---home-url} option allows you to specify a different description file than the default one. For example, the command, \end{htmlonly}\\ \indata{\% Spider.py -H plucker:/test.html -f TestDB}\\ tells the parser to build a document called \name{TestDB.pdb} using the description file \name{test.html} that can be found in \code{\$PLUCKERDIR} (\name{plucker:} is relative to \code{\$PLUCKERDIR}). You can also use an absolute path,\\ \indata{\% Spider.py -H file:/home/pilot/.plucker/test.html -f TestDB}\\ would produce the same result as the first example.\\ Instead of using a local file we can use a file at a remote location,\\ \indata{\% Spider.py -H http://www.plkr.org/ -f PluckerDB}\\ and the parser would use the index page for Plucker's home page as the description file.\\ \note{} The \longoption{Spider.py}{-H} option needs a valid URL, so don't use, \\ \indata{\% Spider.py -H file:test.html -f TestDB}\\ even if you are running the spider in the same directory as the file is located in. \subsection{How deep should we go?}\label{sec:Depth} \begin{latexonly} The default operation of the parser is to parse the description file and any links in it, but this can be changed using the \longoption{Spider.py}{-M} or \longoption{Spider.py}{-{}-maxdepth} option. To make sure that we do not bite off more than we can chew, we can add the \longoption{Spider.py}{-{}-stayonhost} option to avoid following any external links,\\ \indata{\% Spider.py -H http://www.plkr.org/ -M3 -{}-stayonhost -f PluckerDB} \end{latexonly} \begin{htmlonly} The default operation of the parser is to parse the description file and any links in it, but this can be changed using the \longoption{Spider.py}{-M} or \longoption{Spider.py}{---maxdepth} option. To make sure that we don't bite off more than we can chew, we can add the \longoption{Spider.py}{---stayonhost} option to avoid following any external links,\\ \indata{\% Spider.py -H http://www.plkr.org/ -M3 ---stayonhost -f PluckerDB} \end{htmlonly}\\ This would download the index page for Plucker's web site, any links within this page and also any links within those pages, but it would disregard any links outside the \name{plkr.org} host. \\ These options are useful when you specify a specific host using -H. If you use a description file it is better to use the MAXDEPTH/STAYONHOST flags for each link instead. \subsection{Plucker Home and the Plucker Directory} The Plucker directory (\code{\$PLUCKERDIR}) is the current working directory, while Plucker Home is like your home directory. They can be the same directory and the default behavior is that the Plucker directory is set to the same as Plucker Home (default for Plucker Home is \name{\$HOME/.plucker}, but you can change this by using the environment variable \code{\$PLUCKERHOME}). \name{plucker:/XXX} files are first searched in \code{\$PLUCKERDIR} then Plucker Home and any configuration files in the \code{\$PLUCKERDIR} take precedence over those in the Plucker Home.\\ \begin{latexonly} The location of Plucker Home can be changed using the \longoption{Spider.py}{-P} or \longoption{Spider.py}{-{}-pluckerhome} option and the location of the Plucker directory can be changed using the \longoption{Spider.py}{-p} or \longoption{Spider.py}{-{}-pluckerdir} option, \end{latexonly} \begin{htmlonly} The location of Plucker Home can be changed using the \longoption{Spider.py}{-P} or \longoption{Spider.py}{---pluckerhome} option and the location of the Plucker directory can be changed using the \longoption{Spider.py}{-p} or \longoption{Spider.py}{---pluckerdir} option, \end{htmlonly}\\ \indata{\% Spider.py -P \. -H plucker:/test.html -f TestDB}\\ would use the current directory as Plucker Home and the file \name{test.html} should also be in this directory. \subsection{Image handling} \begin{latexonly} The \longoption{Spider.py}{-{}-bpp} and \longoption{Spider.py}{-{}-noimages} options can be used to globally set the image handling. The \option{-{}-bpp} option takes an argument for the bits per pixels that should be used, 0, 1 (default), 2, 4, or 8. The \option{-{}-noimages} option sets the bit depth to 0. To create images in 16 colors (grayscale) you would use, \end{latexonly} \begin{htmlonly} The \longoption{Spider.py}{---bpp} and \longoption{Spider.py}{---noimages} options can be used to globally set the image handling. The \option{---bpp} option takes an argument for the bits per pixels that should be used, 0, 1 (default), 2, 4, or 8. The \option{---noimages} option sets the bit depth to 0. To include images in 16 colors (grayscale) you would use, \end{htmlonly}\\ \indata{\% Spider.py ---bpp=4 -H plucker:/images.html -f Gray16DB} \subsection{URL handling} \begin{latexonly} To save space on you device you can choose to not include information about the URLs. This will mean that you cannot get access to the actual URL for documents in the document or for any external reference. Use the \longoption{Spider.py}{-{}-no-urlinfo} option if you don't want to include this information. \end{latexonly} \begin{htmlonly} To save space on you device you can choose to not include information about the URLs. This will mean that you cannot get access to the actual URL for documents in the document or for any external reference. Use the \longoption{Spider.py}{---no-urlinfo} option if you don't want to include this information. \end{htmlonly} \subsection{Excluding Things} \begin{latexonly} To add more exclusion lists than the default ones you can use the \longoption{Spider.py}{-E} or \longoption{Spider.py}{-{}-exclusion-list} option. The \name{exclusionlist.txt} files should be in a specific format, that is explained in section \~ref{sec:Exclusionlist}. You can add more than one \option{-E}, \end{latexonly} \begin{htmlonly} To add more exclusion lists than the default ones you can use the \longoption{Spider.py}{-E} or \longoption{Spider.py}{---exclusion-list} option. The \name{exclusionlist.txt} files should be in a specific format, that is explained in section \~ref{sec:Exclusionlist}. You can add more than one \option{-E}, \end{htmlonly}\\ \indata{\% Spider.py -H plucker:/exclude.html -E Exclude/default.excl -E Exclude/extra.excl -f ExcludeDB}\\ would use \name{default.excl} and \name{extra.excl} found in \name{\$PLUCKERDIR/Exclude} as extra exclusion lists. \subsection{Sections} \begin{latexonly} The \longoption{Spider.py}{-s} or \longoption{Spider.py}{-{}-extra-section} option is used to add sections to the list of searched sections in the config file(s). You can read more about sections in \~ref{sec:ConfigFile} and \~ref{sec:Examples}. \end{latexonly} \begin{htmlonly} The \longoption{Spider.py}{-s} or \longoption{Spider.py}{---extra-section} option is used to add sections to the list of searched sections in the config file(s). You can read more about sections in \~ref{sec:ConfigFile} and \~ref{sec:Examples}. \end{htmlonly} \section{The Configuration File}\label{sec:ConfigFile} The configuration file allows you to specify default values for global options. Under OS/2 and Windows this file should be called \name{plucker.ini}. For Windows, put this in Plucker Home or in the Plucker directory (\code{\$PLUCKERDIR}). Under Unix/Linux, this file should be called \name{pluckerrc} if it is the system wide config file and \name{.pluckerrc} if it is a user config file. It should have been installed in the correct place (e.g. \name{.pluckerrc} should be in your home directory.)\\ Entries are \code{key = value} pairs ordered into sections. A section is named and begins with a line in square bracket, where the brackets contain the section's name. Lines starting with a \emph{;;} are considered comments.\\ All systems search the \longoption{configuration file}{[DEFAULT]} section. Under Windows, the \longoption{configuration file}{[WINDOWS]} section is also searched, OS/2 will search both the \longoption{configuration file}{[OS2]} and \longoption{configuration file}{[POSIX]} section and all other systems will search the \option{[POSIX]} section. Using the \longoption{Spider.py}{-s} on the command line you can add other sections to search. The parser starts with the \option{[DEFAULT]} section, then the system dependent section(s) and last any sections defined on the command line. If a key is repeated the value for the last one will be used.\\ The following \code{keys} are defined (check the config file that came with your version of Plucker, new keys might have been added after this version of the document was released): \subsection{[DEFAULT]} \begin{description} \item[verbosity] verbosity level (integer, default: 1). \item[bpp] default bits per pixel (integer, default: 1) \item[db\_name] name (on the Palm) of the DB (string, no default) \item[db\_file] filename for the db relative to the plucker dir (string, no default) \item[cache\_dir\_name] name of the directory where cache files will be stored (string, default: cache) \item[home\_url] the URL to home document (string, default: plucker:/home.html) \item[home\_maxdepth] max depth to spider the home document (integer, default: 2) \item[home\_stayonhost] use STAYONHOST for home\_url (boolean, default: false) \item[home\_staybelow] the url part (as STAYBELOW) for home\_url (string, no default) \item[maxwidth] max width for the images (string, default: 150) \item[maxheight] max height for the images (string, default: 250) \item[pluckerdir] path to the plucker dir (string, default: \$HOME/.plucker/) \item[image\_parser] specify which parser to use for converting images, possible values are \emph{windows}, \emph{netpbm2}, and \emph{imagemagick}. (defaults to whatever the system determines to be the default parser.) \item[before\_command] specify commands to be executed before spidering (string, no default) \item[after\_command] specify commands to be executed after spidering (string, no default) \item[user] hotsync user name (string, no default) (Only used on Windows) \item[copyprevention\_bit] set the copy prevention bit in the DB. (boolean, default: false) \item[backup\_bit] set the backup bit in the DB. (boolean, default: false) \item[launchable\_bit] set the launchable bit in the DB. (boolean, default: false) \item[icon] store an icon in the DBs appinfo block. (boolean, default: false) \item[small\_icon] path to Tbmp (15x9), if the icon key is set, use this bitmap for the small icon. (string, default: standard PluckerDB icon) \item[big\_icon] path to Tbmp (32x32), if the icon key is set, use this bitmap for the large icon. (string, default: standard PluckerDB icon) \item[zlib\_compression] a flag indicating whether to use new zlib compression instead of the doc compression. (boolean, default: false) \item[no\_image\_compression\_limit] if a Tbmp is smaller than the given size then it will not be compressed (integer, default 0) \item[category] default category for the created document, if several categories should be used then separate them with ";" (string, default: Unfiled) \end{description} \subsection{[POSIX]} \begin{description} \item[ppmquant\_program] name (and maybe path) to the ppmquant program (string, default: `ppmquant') \item[ppmtoTbmp\_program] name (and maybe path) to the ppmtoTbmp program (string, default: '\mbox{ppmtoTbmp}') \item[pnmscale\_program] name (and maybe path) to the pnmscale program (string, default: `pnmscale') \item[pnmfile\_program] name (and maybe path) to the pnmfile program (string, default: `pnmfile') \item[giftopnm\_program] name (and maybe path) to the giftopnm program (string, default: `giftopnm') \item[djpeg\_program] name (and maybe path) to the djpeg program (string, default: `djpeg') \item[pngtopnm\_program] name (and maybe path) to the pngtopnm program (string, default: `pngtopnm') \item[convert\_program] name (and maybe path) to the convert program (string, default: `convert') \item[exclusion\_lists] a list of filenames specifying exclusion lists to be inspected. Names are separated by colons. (default: nothing) \end{description} \subsection{[OS2]} \begin{description} \item[exclusion\_lists] a list of filenames specifying exclusion lists to be inspected. Names are separated by semicolons. (default: nothing) \note OS/2 will also evaluate the \longoption{configuration file}{[POSIX]}. Do not add any exclusion lists there or you may run into trouble. \end{description} \subsection{[WINDOWS]} \begin{description} \item[exclusion\_lists] a list of filenames specifying exclusion lists to be inspected. Names are separated by semicolons. (default: nothing) \item[convert\_program] path and name for the ImageMagick convert tool with arguments\\ (default: \mbox{convert.exe \%type\%:\%input\% bmp:\%output\%}) \item[bmp\_to\_tbmp] path and name for the Bmp2Tbmp tool (default: \mbox{Bmp2Tbmp.exe -i=\%input\% -o=\%output\%} \mbox{-maxwidth=\%maxwidth\% -maxheight=\%maxheight\% -compress=\%compress\% -color=\%colors\%}) \item[tbmp\_compression\_type] use compression (string, default: yes) \item[python\_program] path and name for the Python executable (string, no default) \item[group\_path] path of the Plucker program group (string, no default) \item[http\_proxy] proxy settings of the form, http\_proxy=http://proxy:port (string, no default) \item[use\_conduit] use conduit.exe to build PDB (boolean, default: true) (only for debugging) \item[close\_on\_exit] close the terminal window when PyPlucker is finished. (boolean, default: false) \end{description} The \option{convert\_program} and \option{bmp\_to\_tbmp} options can be given the following arguments: \begin{itemize} \item \%compress\% = if compression is used it is replaced with the string given by the `tbmp\_compression\_type' key, otherwise `no' \item \%colors\% = `M', `G4', `G16' or `C256' \item \%maxwidth\% = maxwidth value \item \%maxheight\% = maxheight value \item \%input\% = the input filename \item \%output\% = the output filename \item \%type\% = `JPG', `GIF' or `PNG' \end{itemize} \section{The Exclusion List}\label{sec:Exclusionlist} Sometimes, the \longcode{description file}{STAYONHOST} and \longcode{description file}{STAYBELOW} attributes do not give enough selection ability to include only those things that you want included. The parser looks for so called \name{exclusion lists} in form of text files. It first loads the file \name{\$HOME/.plucker/exclusionlist.txt} (if it exists), then it loads \iname{exclusionlist.txt} in the directory you specified with the \longoption{Spider.py}{-p} flag (again, only if it exists) and finally it loads any files specified on the command line using the \longoption{Spider.py}{-E} option and/or found in the configuration file. A default \name{exclusionlist.txt} file is included with Plucker.\\ The filter options in the exclusion list has a very flexible format:\\ \begin{latexonly} \code{\textless prio\textgreater:\textless action\textgreater:\textless regexp\textgreater} \end{latexonly} \begin{htmlonly} \code{::} \end{htmlonly}\\ where: \begin{description} \begin{latexonly} \item[\longcode{exclusion list}{\textless prio\textgreater}] is an integer (negative numbers are also valid) specifying the priority. Rules with higher priorities are considered before rules with lower priorities. Rules of equal priority are considered in the sequence that they appear in the file. \item[\longcode{exclusion list}{\textless action\textgreater}] is either a plus or a minus sign. Plus means `include this document' while minus means `do not include this document'. \item[\longcode{exclusion list}{\textless regexp\textgreater}] a valid regular expression (as known, e.g.\ from perl). \end{latexonly} \begin{htmlonly} \item[\longcode{exclusion list}{}] is an integer (negative numbers are also valid) specifying the priority. Rules with higher priorities are considered before rules with lower priorities. Rules of equal priority are considered in the sequence that they appear in the file. \item[\longcode{exclusion list}{}] is either a plus or a minus sign. Plus means `include this document' while minus means `do not include this document'. \item[\longcode{exclusion list}{}] a valid regular expression (as known, e.g.\ from perl). \end{htmlonly} \end{description} Leading and trailing white space is ignored and empty lines or lines starting with a '\#' are considered comments.\\ Examples: \begin{verbatim} 0:-:.*\.mp3$ 0:-:.*\.wav$ ## Ignore known advertisement sites: 0:-:http://.*ad\.de\.doubleclick\.net/.* 0:-:http://.*ad\.linkexchange\.com/.* \end{verbatim} \section{Use Cases}\label{sec:Examples} To give you a few examples on how to use the parser in real life situations we will describe a number of different use cases. We start with showing how you \emph{pluck} files located on your own system and then continues with examples for how to \emph{pluck} files on remote hosts.\\ In all the examples we will use \name{/home/pilot/.plucker/} as our Plucker Home (and Plucker Directory). In this directory we have two subdirectories, one called \name{HTML} where we store all our different description files and one called \name{DB} used for storing the resulting documents. \subsection{Pluck local targets} The parser can handle any HTML or text document you have on your desktop system, whether it is simple text files or documents from a local web server you run on your desktop. \subsubsection{Creating an E-book} Handling E-books on your Palm is one of the things that Plucker does well. To create such E-books you first have to get the book in either text or (preferable) in HTML format --- \name{Project Gutenberg: \htmladdnormallink{http://www.promo.net/pg/}{http://www.promo.net/pg/}} is a good place to find several old classics and other \emph{free} books. Some books can be found in the \name{Open E-book} (OEB) format. That format is close enough to HTML to be usable by the parser.\\ In this example we will convert Lewis Carroll's \emph{Alice's Adventures in Wonderland} using a copy in OEB format that we got from \name{\htmladdnormallink{http://www.jeffkirvin.com/writingonyourpalm/recommends.htm} {http://www.jeffkirvin.com/writingonyourpalm/recommends.htm}}. After unpacking the file in the \name{HTML} subdirectory we have one large OEB file called \name{alices\_adventures\_in\_wonderland.htm} and the procedure to convert this file into a Plucker document is very simple,\\ \begin{latexonly} \indata{\% Spider.py -v -{}-no-urlinfo -H plucker:/HTML/alices\_adventures\_in\_wonderland.htm \textbackslash}\\ \indata{\textgreater{} -N "Alice in Wonderland" -f DB/Wonderland} \end{latexonly} \begin{htmlonly} \indata{\% Spider.py -v ---no-urlinfo -H plucker:/HTML/alices\_adventures\_in\_wonderland.htm \textbackslash}\\ \indata{> -N "Alice in Wonderland" -f DB/Wonderland} \end{htmlonly}\\ \begin{verbatim} Working for pluckerdir /home/pilot/.plucker Processing plucker:/HTML/alices_adventures_in_wonderland.htm. 0 collected, 0 still to do Retrieved ok Writing out collected data... Writing db 'Alice in Wonderland' to file /home/pilot/.plucker/DB/Wonderland.pdb Converted plucker:/HTML/alices_adventures_in_wonderland.htm Converted plucker:/~parts~/plucker%3a%2fHTML%2fali.....onderland.htm/1 Converted plucker:/~parts~/plucker%3a%2fHTML%2fali.....onderland.htm/2 Converted plucker:/~parts~/plucker%3a%2fHTML%2fali.....onderland.htm/3 Converted plucker:/~parts~/plucker%3a%2fHTML%2fali.....onderland.htm/4 Wrote 1 <= plucker:/~special~/index Wrote 2 <= plucker:/HTML/alices_adventures_in_wonderland.htm Wrote 11 <= plucker:/~parts~/plucker%3a%2fHTML%2fali.....onderland.htm/1 Wrote 12 <= plucker:/~parts~/plucker%3a%2fHTML%2fali.....onderland.htm/2 Wrote 13 <= plucker:/~parts~/plucker%3a%2fHTML%2fali.....onderland.htm/3 Wrote 14 <= plucker:/~parts~/plucker%3a%2fHTML%2fali.....onderland.htm/4 Done! \end{verbatim} We give it a different name than the document itself and also exclude the URL info (we don't need that in an E-book). From the output above you can also see that the document is split into several parts, since we for internal reasons must keep the text documents below 32 kB in size.\\ The document can be found in the \name{DB} directory, \subsubsection{An Admin Guide} The previous example was only using one single file and this example will show you that it is just as simple when the book is divided up into several documents. We will use \name{The Linux System Administrators' Guide} by Lars Wirzenius and Joanna Oja as our test object.\\ Unpacking the files in a separate directory (we will use \name{/tmp/sag/} for this example) we will find several HTML documents and also a bunch of GIF images. We are interested in the images to find out what bit depth we have to use and also their size so we know if they will be scaled down. In this case all images are black and white, so we can use the default bit depth of 1. A few of the images are quite large, so they will be scaled down to 150x250 by the parser. If we really want these images in full size we can either change the HTML document so that instead of including the image \emph{in} the document it will link to the image, i.e.\ instead of, \begin{verbatim} \end{verbatim} we would use, \begin{verbatim} overview-kernel.gif \end{verbatim} Then we can tap on the link to the image when we want to view it. This is something we can only do when we have access to the document and to support this in a more transparent way the parser should be able to do this automatically for you in the future.\\ \begin{latexonly} Since we are not interested in any external documents we will use the \longoption{Spider.py}{-{}-stayonhost} option and a high maximum depth. Then we don't have to worry about exactly how deep we should follow links and what external links we should filter out using exclusion lists. Now we are ready to build the document,\\ \indata{\% Spider.py -v -{}-stayonhost -M5 -H file:/tmp/sag/index.html -N "Linux Admin Guide" -f DB/SAG} \end{latexonly} \begin{htmlonly} Since we are not interested in any external documents we will use the \longoption{Spider.py}{---stayonhost} option and a high maximum depth. Then we don't have to worry about exactly how deep we should follow links and what external links we should filter out using exclusion lists. Now we are ready to build the document, \indata{\% Spider.py -v ---stayonhost -M5 -H file:/tmp/sag/index.html -N "Linux Admin Guide" -f DB/SAG} \end{htmlonly}\\ \begin{verbatim} Working for pluckerdir /home/pilot/.plucker Processing file:/tmp/sag/index.html. 0 collected, 0 still to do Retrieved ok : Processing file:/tmp/sag/backup-timeline.gif. 73 collected, 0 still to do Retrieved ok Writing out collected data... Writing db 'Linux Admin Guide' to file /home/pilot/.plucker/SAG.pdb Converted file:/tmp/sag/book1.html : Converted file:/tmp/sag/x89.html Wrote 1 <= plucker:/~special~/index Wrote 2 <= file:/tmp/sag/index.html Wrote 3 <= plucker:/~special~/pluckerlinks Wrote 11 <= file:/tmp/sag/backup-timeline.gif : Wrote 83 <= mailto:gregh@sunsite.unc.edu Wrote 87 <= plucker:/~special~/links1 Done! \end{verbatim} Install the document you find in \name{/home/pilot/.plucker/DB} and you have instant access to \emph{The Linux System Administrators' Guide}. \subsection{Pluck remote targets} E-books and manuals in all glory, but many times we want to get fresh articles that updates every day. Well, Plucker can handle that, too. \subsubsection{Daily News} To be able to get the latest news from \name{Wired} we will set up a special section in the configuration file, so that we only have to run,\\ \indata{\% Spider.py -s wired}\\ every morning to get the latest version of \name{Wired} for later perusal.\\ The handheld friendly version of \name{Wired} is located at \name{\htmladdnormallink{http://www.wired.com/news\_drop/palmpilot/} {http://www.wired.com/news\_drop/palmpilot/}} and we want to pluck it to a depth of 3 levels. We also know that it only uses black and white images. This give us the following section in the configuration file (\name{/home/pilot/.pluckerrc}), \begin{verbatim} [wired] bpp = 1 home_maxdepth = 3 home_url = http://www.wired.com/news_drop/palmpilot/ db_file = DB/Wired \end{verbatim} \subsubsection{Comics} We need some fun, too, so let's download a few strips for some well known comics. To simplify things we will use a tool called \name{netcomics} to get the comics and then use a local description file to build the document. How to install \name{netcomics} is beyond this tutorial, but it is a Perl script and might work on any platform that have Perl support (for Linux users there exists pre-built packages). After you have installed \name{netcomics}, you should create a small shellscript called \name{netcomics.sh} to be used by the parser, \begin{verbatim} #!/bin/sh netcomics -D -d /tmp/Comics/ -c "ch dilbert dilbertcl uf" ( cd /tmp/Comics ; \ mv Dilbert-*.gif Dilbert.gif ; \ mv Dilbert_Classics-*.gif Dilbert_Classics.gif ; \ mv Calvin_and_Hobbes-*.gif Calvin_and_Hobbes.gif ; \ mv User_Friendly-*.gif User_Friendly.gif ) \end{verbatim} On OS/2 and Windows this will look like the follwing. On OS/2 it should be named \code{netcomics.cmd} whereas on Windows it should be named \code{netcomics.bat}: \begin{verbatim} perl netcomics.pl -D -d \temp\Comics\ -c "ch dilbert dilbertcl uf" cd \temp\Comics move Dilbert-*.gif Dilbert.gif move Dilbert_Classics-*.gif Dilbert_Classics.gif move Calvin_and_Hobbes-*.gif Calvin_and_Hobbes.gif move User_Friendly-*.gif User_Friendly.gif \end{verbatim} This script will download Calvin \& Hobbes, Dilbert, Dilbert Classic and UserFriendly to a separate directory (\name{/tmp/Comics/}) and rename the date specific files into a general format that can be used in the local description file, \begin{verbatim}

Comics Home Page

Dilbert

Dilbert Classic

Calvin & Hobbes

UserFriendly

\end{verbatim} To simplify things even further we will also add a new section for the comics, \begin{verbatim} [comics] bpp = 4 home_url = plucker:/HTML/comics.html maxwidth = 600 maxheight = 200 db_file = DB/Comics before_command = "netcomics.sh" \end{verbatim} \note On OS/2 or Windows you can use the before\_command to the set the name of your batch file. As you can see we have added the shellscript as a command that should be run \emph{before} the description file is parsed. Everyday (except on Sunday when the strips are too large for these options --- we will show a solution to that later in the section) we now only have to run,\\ \indata{\% Spider.py -v -s comics} \begin{verbatim} Executing 'before_command': "netcomics.sh" Working for pluckerdir /home/pilot/.plucker Processing file:/home/pilot/.plucker/HTML/comics.html. 0 collected, 0 still to do Retrieved ok Processing file:/tmp/Comics/Dilbert.gif. 1 collected, 3 still to do Retrieved ok Processing file:/tmp/Comics/Dilbert_Classics.gif. 2 collected, 2 still to do Retrieved ok Processing file:/tmp/Comics/Calvin_and_Hobbes.gif. 3 collected, 1 still to do Retrieved ok Processing file:/tmp/Comics/User_Friendly.gif. 4 collected, 0 still to do Retrieved ok Writing out collected data... Writing db 'Comics' to file /home/pilot/.plucker/DB/Comics.pdb Converted file:/home/pilot/.plucker/HTML/comics.html Wrote 1 <= plucker:/~special~/index Wrote 2 <= file:/home/pilot/.plucker/HTML/comics.html Wrote 3 <= plucker:/~special~/pluckerlinks Wrote 11 <= file:/tmp/Comics/Calvin_and_Hobbes.gif Wrote 12 <= file:/tmp/Comics/Dilbert.gif Wrote 13 <= file:/tmp/Comics/Dilbert_Classics.gif Wrote 14 <= file:/tmp/Comics/User_Friendly.gif Wrote 15 <= plucker:/~special~/links1 Done! \end{verbatim} To be able to use it also on Sundays we add yet another section to the configuration file, \begin{verbatim} [sunday] bpp = 2 maxwidth = 550 maxheight = 400 db_file = DB/SundayComics \end{verbatim} Using a lower bit depth for the images we are now able to include larger versions of the comics. Each Sunday we would run,\\ \indata{\% Spider.py -s comics -s sunday}\\ and since the parser applies the sections in the given order the changed values in \name{sunday} will override the ones in \name{comics}. plucker-1.8/docs/Credits.tex0100644000076400001440000000640107760075465015133 0ustar mickeusers% % $Id: Credits.tex,v 1.7 2003/11/23 09:17:41 nordstrom Exp $ % \chapter{Credits: The People who brought you Plucker} \section{Authors} \begin{itemize} \item \textbf{Mark Lillywhite} \htmladdnormallink{plucker@rubberchicken.org}{mailto:plucker@rubberchicken.org}: Originator, mailinglists, bug fixing, viewer development \item \textbf{Michael Nordstr\"{o}m} \htmladdnormallink{micke@sslug.dk}{mailto:micke@sslug.dk}: Viewer maintainer, bug fixing, API documentation, configuration scripts, Linux/Unix package \item \textbf{David A. Desrosiers} \htmladdnormallink{hacker@gnu-designs.com}{mailto:hacker@gnu-designs.com}: CVS-maintainer, web site, viewer development \item \textbf{Holger D\"urer} \htmladdnormallink{H.Duerer@zait.uni-bremen.de}{mailto:H.Duerer@zait.uni-bremen.de} Python parser \item \textbf{Dirk Heiser} \htmladdnormallink{plucker@dirk-heiser.de}{mailto:plucker@dirk-heiser.de} Delphi-Conduit and all the stuff for Windows \item \textbf{Alexander Wagner} \htmladdnormallink{A.Wagner@TeamOS2.de}{mailto:A.Wagner@TeamOS2.de}: Perl-based conduit, the original OS/2 specific stuff (with great help from the people above), documentation reorganization, German translation \item \textbf{Chris Hawks} \htmladdnormallink{chrish@syscon-intl.com}{mailto:chrish@syscon-intl.com}: Viewer development, Python parser, pluck-comics \item \textbf{Bill Janssen} \htmladdnormallink{bill@janssen.org}{mailto:bill@janssen.org}: Python parser, image-processing utilities, documentation \item \textbf{Robert O'Connor} \htmladdnormallink{rob@medicalmnemonics.com}{mailto:rob@medicalmnemonics.com}: Viewer development \item \textbf{Thorsten Ratzka} \htmladdnormallink{tnratzka@gmx.net}{mailto:tnratzka@gmx.net}: OS/2 Installer using WarpIN, OS/2 configuration tools \item \textbf{Ondrej Palkovsky} \htmladdnormallink{ondrap@penguin.cz}{mailto:ondrap@penguin.cz} Python parser \item \textbf{Patrick Trainor} \htmladdnormallink{ptrainor@title14.com}{mailto:ptrainor@title14.com}: Perl spider/gather/parser development \item \textbf{Jiva DeVoe} \htmladdnormallink{jiva@devware.com}{mailto:jiva@devware.com}: Viewer development \end{itemize} If you feel left out, send e-mail to \devaddress! \section{Credits} The following kind folks provided support, ideas or conversation as part of the Plucker project.. may they live long and plucker: \begin{itemize} \item Adam Elman \item Adam Spiers \item Alan Harder \item Alexander Wunsch \item Andreas Gaufer \item Andrew Howlett \item Andy Rabagliati \item Byron Collins \item Claus Hindsgaul \item Daniela Di Candia \item David Martin \item Eric Sandeen \item Ethan Bakshy \item F. Zehner \item Friedrich Knauder \item Hayen Iggena \item Horst Roos \item Jacob Sparre Andersen \item Jay Tamboli \item Joachim Bergmeyer \item Jon slund \item Kenneth Albanowski \item Laurent Pasquer \item Magnwa Spiritseer \item Marcus Specht \item Mark Seaborn \item Masakazu Matsumoto \item Matti Airas \item Nick Vargish \item Nicolas Huillard \item Oliver Hertel \item Thomas A. Dierig \item Thomas Zahreddin \item Thorsten Stremetzne \item Tom Zerucha \item Uwe Mssel \item William Kendrick \end{itemize} If you feel left out send e-mail to \devaddress! plucker-1.8/docs/Quickstart.tex0100644000076400001440000006427207712230706015666 0ustar mickeusers% % $Id: Quickstart.tex,v 1.17 2003/07/31 15:12:06 desrod Exp $ % \chapter{Installation and Quickstart Manual} This chapter describes how to set up Plucker on your system and how to configure it to gather contents for you. It does not cover all features of Plucker for which you might refer to later chapters of this handbook, but it will give you an introduction on how to use Plucker's basic features. Many of the advanced topics are not covered here to make this introduction readable even for beginners and as simple as possible. Once you got the generals procedures of Plucker it will be easy for you to understand the later parts of this handbook which are meant mainly as reference guide. \section{OS specific instructions} First of all we will list some of the OS specific installation procedures as well as OS specific things you should know to run Plucker. \subsection{OS/2} Basically there are two ways to install Plucker on OS/2: \begin{itemize} \item The Expert: You may obtain all packages you need to run Plucker separately and set them up by hand. This would be the preferred way if you have already several packages installed on your system (unless you work a lot with Unix-style tools on OS/2 this is not very likely the case) and if you have some experiences setting up such stuff. \item The Easy way: Just get the WarpIn-Installation packages and run install. This is the preferred way for new and/or inexperienced users and if you do not have the main parts to run Plucker installed on your system. \textbf{Unless specific circumstances or environments we encourage you to use this way!} The OS/2-installer will do no harm to your system and it will make it quite easy to de-install Plucker. \end{itemize} In any way you will get all files needed on our OS/2 page at \textit{\htmladdnormallink{http://www.stellarcom.org/plucker/os2\_bins/index.html}{http://www.stellarcom.org/plucker/os2_bins/index.html}}. On this page you will find all tools necessary to set up Plucker either way you choose.\\ \note You need to install Plucker on a HPFS-partition. It will not work on FAT file systems.\\ \note Currently there persist still some problems with image conversion on OS/2 so you might not be able to use images in your documents. We work on a solution to that issue. After setting up Plucker please refer to chapter \~ref{sec:Parser} on how to set up the necessary configuration files for Plucker. \subsubsection{Using the Installer} As stated above this is very easy indeed. Follow these steps: \begin{enumerate} \item After downloading \name{PluckerInstaller.zip} just unzip it using your favorite tool to handle ZIP-files. (e.g.\ just type \code{unzip PluckerInstaller.zip} from your shell.) \item Copy the \name{WarpIn} folder to whatever location you want to store \name{WarpIn} at. If you have WarpIn already installed you may skip this step. (But ensure that you have the same or a newer version of WarpIn.) After this open that folder and double-click on \name{\name{WarpIn}.exe}. This will create the necessary program objects and associations to use \name{WarpIn}. Note that \name{WarpIn} is not written explicitly for Plucker and that we only use it. For details about \name{WarpIn} refer to its \name{README} files and documentation. \name{WarpIn} is Freeware.\\ \note Once you have installed \name{WarpIn} on your system you can use it to install any other product that is delivered in WPI format. An increasing number of tools use this for there installation. \item Now you are ready to install Plucker itself. This is quite easy. Open the folder where you unziped Plucker on the WPS and just double-click on the several WPI-packages (you may note that they are now associated with \name{WarpIn}.) This fires up \name{WarpIn} which asks you some basic questions on where you want to store the files and stuff like that. Simply follow the on-screen-instructions. \item The installer will create a folder on your Desktop called \name{Plucker for OS/2} which will contain all necessary objects for using Plucker. Additionally it will set up Python and Pilot-Link as well as ImageMagick for image conversion. \end{enumerate} That's it! Now you are ready to run Plucker on OS/2. \\ But before you start your first plucking we want to remind you to read section \~ref{sec:basic} to set up Plucker to gather the right contents. You need to follow the steps there to get useful results.\\ For detailed instructions how to use Plucker refer to the other chapters in this documentation. You may find some hints on how to make most out of Plucker in the appropriate locations within normal documentation, just in case there is anything different on OS/2 than on all the other platforms. You may note that this is very rarely the case at all.\\ \note If you have any of the packages already installed that are delivered by the installer (most likely this will be the case with Pilot-Link) then simply skip it in the installation process for Plucker. \subsubsection{Setting up by hand} This section will be quite short as we assume that you know what you are doing. You will find all tools necessary for at \textit{\htmladdnormallink{http://www.stellarcom.org/plucker/os2\_bins}{http://www.stellarcom.org/plucker/os2\_bins}} The basic steps: \begin{enumerate} \item Set up Python for OS/2 \item In case you want to use zLIB-compression (see below) you need to install the additional zLIB.DLL for Python. (See our web site.) \item Install \name{ImageMagick} or \name{NetPBM} (whatever you prefer) for image conversion. Note that Plucker needs two additional converters for creating usual TBMP-format used on your hand-held. So we suggest that you get either of this packages from our web site. The necessary converters in current versions are included in the packages provided there. \item Install \name{Pilot-Link for OS/2} \item Unzip Plucker to the directory where you want to store the program \item Make sure that the environment variable \name{\$HOME} is set \item Create a directory called \code{.plucker} within your \name{\$HOME}-directory. \end{enumerate} If all packages are properly set up (this includes necessary changes to \textit{CONFIG.SYS}, path-/libpath-entries and some environment variables, refer to the docs of each package for this) you are ready to run Plucker. Simply continue with the usual configuration.\\ Again: If you do not know what we where talking about here we suggest that you use the installer. It will take care about all the necessary settings. If you have any of the packages already installed that are delivered by the installer then simply skip it in the installation process for Plucker. \subsection{Unix/Linux} There are several ways to get Plucker installed \begin{itemize} \item RPM package \item DEB package \item TAR package with binaries \item TAR package with source code \end{itemize} If you install the RPM package, you only have to run \name{plucker-setup} to set up the Plucker environment in you home directory (see chapter \~ref{sec:Parser} for more info about changing the description, configuration and exclusion list files) If you have downloaded the binary TAR package, then do the following: \begin{enumerate} \item Unpack the file. \item Go to the \name{unix} directory. \item Run \name{./install-plucker} \item Answer the questions about where the files should be installed. \end{enumerate} If you have downloaded the source package, you will do the same thing as explained above, but this time you must have \textbf{all} development tools installed to be able to build all parts of Plucker. \subsection{Windows} On Windows we encurage you to use the graphical installer we provide. It will take care about all steps necessary to set up Plucker correctly. The follwoing steps are necessary to get Plucker running on Windows using this installer: \begin{enumerate} \item Download the Installerpackage for Windows from our web page and run it. \item Follow the on-screen instructions. \end{enumerate} \section{Basic customization - Or: Before you start} \label{sec:basic} Now you have set up Plucker on your workstation. What is left to do? \begin{itemize} \item Tell Plucker what pages to gather \item Customize the hotsync-script (only OS/2 and Windows) \item Start your first plucking and check that everything work as expected \end{itemize} The first goal is achived by creating a document called \emph{description file} or \emph{home document}. The second is only necessary if you are running OS/2 or Windows and is normally done by editing a script called \emph{hotsync} (although you can name it whatever you like). And the last step is to run this script or to run \emph{plucker-build} if you are using Linux/Unix. \subsection{Specifying the pages you want to view - The Home Document} The home page is the first page you see when you start Plucker on your PDA, and is also the page you see when you tap on the \emph{home} icon (the little house) in the viewer on the Palm OS hand-held device. The home page is by default created using the description file at \name{\$HOME/.plucker/home.html}.\\ When you installed Plucker, a default description file was put in \name{\$HOME/.plucker}. You can change this file in any text editor and it doesn't require deep knowlege of HTML to create it. We will explain how to do this step by step in a minute.\\ Except for the \longcode{description file}{MAXDEPTH} and similar attributes the \name{description file} is like any other HTML file. This also means that you can view \name{home.html} in your normal web browser (e.g. Netscape). In fact you can even use a normal web page at some web server as your home document. See chapter \~ref{sec:Parser} for details on how to do this.\\ Prior to performing a HotSync, you have to tell Plucker about where to grab the pages that you want to view. Plucker starts by scanning the \name{description file} (also refered to as \name{home document}) that you have defined. As stated above if you did not define otherwise this will be \name{\$HOME/.plucker/home.html}. \\ The parser finds any links in that file, and follows them. Each link (e.g.\ something like \verb||) is read from the Internet, stored and parsed on your hard disk and included in the document that you will later sync to your Palm. Let us explore the \name{description file} in more detail.\\ A simple, typical home document will look like this (without the linenumbers, they are only added for easier reference later on):\\ \begin{verbatim} [01]\t

Plucker Home

[02] [03]\t

Plucker Information

[04]\t

Plucker home page

[05] [06]\t

Linux links

[07]\tSlashdot.org

[08]\t

News

[09]\tNew York Times

[10]\tC-Net NEWS.COM

\end{verbatim} Here you see several typical examples. First of all you may note that this document follows the general outlines of normal HTML as stated above. If you do not know HTML already, do not worry. What you need here is really very easy. Let us look it trough line by line. (If you already know HTML this will be somewhat boring to you.)\\ First you note that commands in HTML are enclosed in angle brackets. Each command has a begin and an end always using the same tag, the end marked by an additional slash in front of the tag's name. The first and 3rd row e.g.\ create Headlines. The numbers simply specify different fontsizes.\\ \begin{latexonly} More interesting is the 4th line. First it starts a new paragraph (\textless P\textgreater) and then you see the most important tag in HTML: a link. Links have the following form: \end{latexonly} \begin{htmlonly} More interesting is the 4th line. First it starts a new paragraph (

) and then you see the most important tag in HTML: a link. Links have the following form: \end{htmlonly}\\ \begin{verbatim} Plucker home page \end{verbatim} Enclosed in quotes you find the page they refer to (the URL) then after an closing angle bracket you see the title of the link that should be displayed to the user. You will see exactly this text within Plucker on your home document.\\ Now you have the basic procedure how to tell Plucker to get a specific web page for you. What does Plucker do if it finds a tag like this in \name{home.html}? It will simply follow the URL you specified and get this page. Note that as this page is plain HTML you can also view it within your normal web browser and use the links the same way as Plucker does it. That way you can easily check if all links are working as you expected without the need to run the parser each time and sync.\\ Well, it is nice to grab a web page, but what to do with a newsticker that lists only the headlines? You want to retrieve the articles as well. Let's have a look at line 9. You will note that this time the link is enhanced by an additional tag: \code{MAXDPTH=2}. This is the way to instruct Plucker to retrieve deeper levels from a web server. You can give \code{MAXDEPTH} any number as parameter. \code{MAXDEPTH=2} means to load the target (linked-to) page, and any targets within that page. This will just do the job. It will first grab the headlines and then follow all linked pages to get the articles as well.\\ \code{MAXDEPTH=3} will load the target page, its linked pages, and any pages linked within there and so on. You really do not want to set \code{MAXDEPTH} too high. That could be very bad. A \code{MAXDEPTH} of well under 50 would probably load the entire Internet, so you may run into some storage problems\ldots\\ \code{MAXDEPTH} is one of the most important tags used to customize the information to download. Another important tag is \longcode{description file}{NOIMAGES}. A sample on how to use it can be found in line 7. If you do not want to download any images you should specify this tag. Simply add it after the URL to pluck. As you see in line 7 you can combine the various tags. That is line 7 instructs Plucker to download only the title pages without images. You see you can even explicitly specify a value of 1 to the \code{MAXDEPTH} argument. This does not make much sense at the first glance as our first example showed that leaving out the \code{MAXDEPTH} statement will give the same result. But stop. The reason to give a explicit \code{MAXDEPTH} is that you can define which depth is the default for Plucker within Pluckers configuration file we will talk about later on. So if you set the default depth to 2 e.g.\ but this page should definitely be plucked only to a depth of 1 you can specify it explicitly here instead of defining a depth of 2 for all other pages. (It is not a bad idea to define the depth explicitly for all pages as one can see at first glance how deep Plucker will work.)\\ Now in line 7 you see another possibility of Plucker. You might have wondered about these funny chars that appear in the url. Well with that definition you instruct Plucker to request the result of a so called CGI and to pass some paraeters as well. A CGI is basically a script run by a web provider to gather explicit informations e.g.\ from a database. You do not need to worry about the details, the easiest way to get the correct URL is always to point your web browser to the page where the information is located and copy the URL from its URL-field into the home-document of Plucker. Here we just wanted to show that Plucker can even handle such funny URLs.\\ \hint{} If you specify a CGI for a newsticker and you always get the same news it is most likely that the date of the issue is passed to the script via the URL.\\ \note \code{MAXDEPTH} will most likely be sufficient for web pages that where written for PDAs. If you are plucking \emph{normal} web pages be careful with \code{MAXDEPTH}, as many pages contain a menu to navigate the site and Plucker will follow these links as well. That is Plucker does not distinguish between a menu or a \emph{normal} link. That way a \code{MAXDEPTH=2} which is meant to download an overview page and the articles (e.g.\ of your newspaper) could easily result in Plucker trying to retrieve the news archive of your favourite newspaper as well (since it is linked from within the menu). So it is wise to attend the first runs of Plucker if you add new pages to your description file, especially if you do not use PDA-optimized pages. There are very effective ways to prevent Plucker from running into this kind of problems. Besides the \code{MAXDEPTH} and \code{NOIMAGES} tags there are various other tags that influlence the gathering process. E.g.\ you can have Plucker to exclude specific links etc. See below in chapter \~ref{sec:Parser} for details about. We will not go into to much details here.\\ \hint{} Web pages created for handhelds have some advantages over normal web pages. Plucker can retrieve normal web pages, no matter, but specially designed pages are normally smaller, contain less graphics etc.\\ \hint{} Plucker can not handle \emph{frames}. Usually, pages designed for handhelds do not contain frames\ldots\\ \hint{} A good collection of links to handheld friendly sites are included with Plucker.\\ Our German speaking users can find sites with mostly German content at \htmladdnormallink{http://www.palmtop-portal.de}{http://www.palmtop-portal.de}. \section{Running the Parser} Now that you have created your description file you are ready to run the parser to get the pages. For our simple case here this does not require much. Simply open a command line window, change to the directory where you installed the python parser and run the following (\% is the shell prompt)\\ \indata{\% python PyPlucker/Spider.py -f PluckerDB} (This call will work on any system, on Unix you can leave out the explicit call to Python of course.) Make sure you have established a connection to the Internet before you issue this call.\\ Now the parser will read your freshly created \name{home.html} follow the links the way you defined them and finally write a file to your harddisk called \name{PluckerDB.pdb}. In case of problems you might want to add the additional parameter \code{-V2} to see where the error occurs.\\ \note{} The spider has plenty of parameters. You will find a detailed description of all of them in chapter \~ref{sec:Parser}. Additionally to the parameters specified to the parser call you can set default values in a file calles \name{plucker.ini} (on OS/2 and Windows) or \name{.pluckerrc} (on Unix). So if something happens that you did not expect it is a good idea to check this file. A detailed description of the parameters for this file and its format can also be found in chapter \~ref{sec:Parser} and within the file itself. \section{Transfer to your Palm} After you ran the parser on your system it will generate a document for you, that is a file suitable for the viewer. Of course you need to transfer this document to your handheld. By default we suggest the usage of \code{pilot-xfer}. \code{pilot-xfer} is one of the tools (more or less the central tool) of the famous \name{pilot-link} package which is available for numerous platforms. For Unix and OS/2 you might find both the binary and the source distribution at \\ \htmladdnormallink{ftp://ryeham.ee.ryerson.ca/pub/PalmOS/}{ftp://ryeham.ee.ryerson.ca/pub/PalmOS/}\\ for Windows please have a look at Thilo Christs port at \\ \htmladdnormallink{http://linux.stud.fh-heilbronn.de/~christ/pilot-xfer}{http://linux.stud.fh-heilbronn.de/~christ/pilot-xfer}\\ Besides that Plucker offers its own conduit for Windows which cooperates directly with the usual HotSync, and there is as well a perl-based conduit available which you can still use to transfer the data (though you might only want to use it in very special circumstances, and in fact we discourage its usage). \subsection{Pilot-Link} Though the general usage of Pilot-Link package is beyond the scope of this manual we will tell you enough to transfer your documents on the Palm using Pilot-Link. On Unix and OS/2 you have mainly two choices: \begin{enumerate} \item Create a document with the parser and transfer that one \item Create a so call \textit{cache-directory} and use the perl-based conduit. \end{enumerate} We encourage you to use the first method as it is easier and does not require working perl and pilot-link's perl-interface on your system. The perl based conduit may offer you some advantages though, so its covered in the advanced topics. Please have a look there.\\ The usage of \name{pilot-xfer} is quite simple. Provided you set up the package correctly (on OS/2 this is done by the installer) all you need to do is \indata{\% pilot-xfer -i FILE \ldots} This will prompt you to press the hotsync button and then transfer the document to your handheld. On OS/2 you can of course use the WPS to do this. Simply open the folder where you stored your documents and double-click on the one you want to install. (The GUI-installer has set up he appropriate connections for you already.)\\ \hint{} In case you have more than one document to transfer you can also use the \option{-r} switch and invoke \name{pilot-link} the following way to transfer all documents within a directory at once \indata{\% pilot-xfer -r DIR} \\ \hint{} For OS/2 users. If you need to do this very often you might want to enhance the context menu of your document folder by this function. Actually this is quite easy. Just create a program object that contains the necessary call with all parameters needed (in the program field just enter \code{pilot-xfer.exe}, in the parameters field you might want to enter \code{-r \.}. Note the full-stop in the argument), then open your folder settings and go to the \name{Menu} page. Now simply drop the newly created program object in the lower list box and name it appropriately using the \name{Settings..} button. Now the context menu of your folder will have an additional entry to transfer the whole folder to your hand-held. You might want to generate a shadow of that folder on your desktop for easy access. \subsection{The Windows conduit} The Windows conduit is, unlike \name{pilot-link}, entirely written for Plucker. For that it offers some parameters quite specific which we will elaborate a bit about here. Additionally it transfers the data not directly to the Palm but notifies the Hotsync Manager about a document waiting for transfer, that is the document is sent to your hand-held on your next HotSync-operation, not like on Unix when you call the conduit.\\ The first difference in the usage is that it is thought to be used with \textit{cache-directories}. That is it assumes that you run the parser using \option{-c}. The new version supports the transfer of a complete document as well though. \\ All parameters are in the form \option{-parameter=value}. Note that they do not follow POSIX conventions nor the normal DOS-conventions. Use one minus sign to separate all parameters. If you specify no parameter at all you will get a short help message. The possible parameters are: \begin{itemize} \item \option{-dir}: The path to \code{\$PLUCKERDIR} \item \option{-user}: Hotsync manager needs to know for which user the document in question should be installed. (As you know the Hotsync Manager allows for multiuser environments.) Use this switch to set the username. \note You must set this parameter. Without it no data will be transfered. \item \option{-cache}: The name of the cache-directory if you use the parser with the \option{-c} switch. The default value is \name{Cache} if you do not provide that parameter. This path is given relative to the path you provided with \option{-dir}. \item \option{-id}: Creator ID for the document. Default is \textbf{Plkr}. You may not want to change this value. \item \option{-dbversion}: Versions number for the document. Default is 7. You may not want to change this value. \item \option{-dbname}: Name of the document, that is the name with which the document will show up on the Palm. Default is \emph{PluckerDB}. You will want to change this, and you have to change it if you want multiple documents. \item \option{-fname}: Filename for the document on your local harddisk. Default \emph{PluckerDB.pdb}. You need to change this for multiple documents. \item \option{-fix}: 0x0D0A Sequences are converted to 0x0A. Normally you should not need this parameter anymore. \item \option{-install}: Install a document. This parameter is needed instead of \option{-cache} if you run the parser with the \option{-f}-switch. \option{-user} must be set, \option{-dir} must not \item \option{-verbose}: Set the verbosity Level. Default are \begin{itemize} \item[0] = Verbosity level 0 is silent except for errors (\emph{No news is good news}) \item[1] = Verbosity level 1 gives progress status \item[2] = Verbosity level 2 is used for debugging \end{itemize} \item \option{-copyprev}: Set the CopyPrevention flag for the document. You may not be able to copy such documents from one Palm to another (easily). Useful for confidential data (but do not consider it to be a sufficient security lock.) \item \option{-backup}: Set the backup flag for the document, documents without this flag will not be backed up by hotsync. \item \option{-launchable}: Set the launchable flag for the document Set this to see your document like a program in the Palm's launcher. \end{itemize} \note The last three parameters are only useful if you run the parser with the \option{-c} parameter that is you let it write cache directories instead of whole documents. Otherwise the parser will add this flags if you tell it to do so. \section{Finally..} After you successully retrieved your documents and enjoyed reading them on your PDA you might want to do this every day. To ease things up consider putting these calls into a short script file. On OS/2 and Windows simly create a file called hotsync.cmd (OS/2) or hotsync.bat (Windows) and place the calls just like you would have entered them on the command prompt. In case you use dial up conections to the internet you can even include the calls to build up that connection before the gathering process starts.\\ Now you should be ready to start using Plucker. The next chapter will describe the client application on your hand-held, the \emph{Viewer}. plucker-1.8/docs/explode.10100644000076400001440000000476407527026407014541 0ustar mickeusers'\" t .\" $Id: explode.1,v 1.1 2002/08/15 22:36:55 janssen Exp $ .\" .\" man page for explode -- a Plucker-to-HTML converter .\" Copyright 2002 (c) Bill Janssen, .\" .\" This man page 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 man page 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 man page; if not, write to the Free Software .\" Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. .\" .\" explode.1 .TH EXPLODE 1 "Plucker 1.2 - http://plkr.org/" .SH NAME explode \- convert a Plucker document to a set of HTML pages and image files .SH SYNOPSIS \fBexplode\fR [--directory=\fIDIR\fR] [--verbose] \fIDOCUMENT-FILENAME\fR .SH DESCRIPTION .B explode converts a Plucker binary document specified by \fIDOCUMENT-FILENAME\fR to a set of HTML pages and JPEG image files in a directory. The directory used may be explicitly specified, or automatically created by \fBexplode\fR; if automatically created, the pathname of the directory will be output to stdout. After \fBexplode\fR terminates, the directory will contain a file called "default.html" which contains a transliteration of the root page of the Plucker document, as well as other HTML and image files. .SH OPTIONS .TP \fB--directory=\fIDIR\fR Specify, as \fIDIR\fR, the full pathname of the directory in which to create the converted version of the document. .TP \fB--verbose\fR Output various debugging messages to stderr while performing the document conversion. .SH EXAMPLES To invoke a browser called \fIwebbrowser\fR on a Plucker document called \fIMenu.pdb\fR, one might say .sp \fC% webbrowser file:`explode Menu.pdb`/default.html .sp Or alternatively, .sp \fC% explode --directory=/tmp/Menu Menu.pdb .br % webbrowser file:/tmp/Menu/default.html\fR .SH "SEE ALSO" \fBThe Plucker User's Guide\fR, at \fChttp://plkr.org/docs/\fR. .SH "BUGS" As of Plucker release 1.2, there are no provisions for handling margins or colored text. .sp Report bugs to http://bugs.plkr.org/ or .SH "AUTHOR" Bill Janssen, plucker-1.8/docs/plucker-dump.10100644000076400001440000000142007425644743015501 0ustar mickeusers.\" plucker-dump.1 .TH PLUCKER-DUMP 1 "Plucker 1.1 - http://plkr.org/" .SH NAME plucker-dump \- dumps a Plucker document .SH SYNOPSIS \fBplucker-dump\fR [-h] [-v] [-c \fIcachedir\fR] dbfile .SH DESCRIPTION .B plucker-dump dumps a Plucker document back into the \fIcachedir\fR directory. \fBWARNING: THE CACHE DIRECTORY GETS ERASED !!!\fR You have been warned. .SH OPTIONS .TP \fB-h\fR display usage information and exit .TP \fB-v\fR output version information and exit .TP \fB-c\fR \fIcachedir\fR use the specified \fIcachedir\fR instead of the default ($PLUCKERDIR/cache) .SH "SEE ALSO" plucker-decode(1) .SH "AUTHOR" Holger Duerer (man page by Michael Nordstrom, ) Report bugs to http://bugs.plkr.org or plucker-1.8/docs/Links.tex0100644000076400001440000004542307365403431014612 0ustar mickeusers% % $Id: Links.tex,v 1.3 2001/10/24 00:11:05 desrod Exp $ % \begin{htmlonly} \chapter{Palm Friendly Links} \section{General Links} \end{htmlonly} \begin{rawhtml} BBC News Online

Business Thinkers Digest

Business Times Singapore

CNET NEWS.COM

CNNfn

Cruisin News

Excite to go

ExploreZone

Financial Times

Fort Wayne News Sentinel

Gabriels Channel

HandyFact

Harbus Online - Palm Edition

ITN News

IndustryWeek

InfoSpace

InfoSpace World News

InfoWorld

Jerusalem Post

LinuxToday

Mercury Center

NYC City Search

PA News Center

PDAntics

PMN News Centre

Palm Boulevard

Palm Gear HQ

Palm Infocenter

Palm Stuff at Studio Nibble

Palm Power Magazine

Palm Power Magizine Compact

Palmguru

Pen Computing

PioneerPlanet News

SPUG Features

SPUG News

SPUG Reviews

Salon.com

SciFi Wire

Scoop - Sony/Tristar

Seattle Times

SecurityFocus

Showbiz Scoop Mobile

Slashdot (native)

Slashdot

Slate

Star Tribune

Straits Times Singapore

TVGEN

Tap Weekly

The Economist - Mobile Edition

The Guardian

The Industry Standard

The Motley Fool

The Net

The New York Times

New York Times Book Review

New York Times Tech News

The Sporting News

The Wall Street Journal

The Wayfarer Online

TheStreet.com

USA Today

USA Today MoneyLine

USA Today Sportsline

USA Today Tech News

Variety.Com

Wired News

ZD Network News

ZDNN Computing

ZDNN Internet

ZDNN Rumors & Comment

ZDNet's HOT Palm File of the day

ZDnet Bussiness

Ontheroad.com

FOX news

The Daily Learner

Weather For NE States and counties (text)

IWIN National Weather Service (text)

Weather24: Dallas, TX

Weather24: Denver, CO

Weather24: Honolulu, HI

Weather24: Los Angeles, CA

Weather24: Miami, FL

Weather24: New York, NY

Weather24: Philadelphia, PA

Weather24: San Francisco, CA

Weather24: Seattle, WA

Weather24: Washington, DC

Joke Of The Day

PalmStation

SonicNet (music news)

Phillynews.com Philadelphia

Miami Herald

Detroit Free Press

FOX Sports

Asimba Health/Fitness

That's Racin! Nascar

Bloomberg

Fox MarketWire

Hoosier On-Line News

Online Vacation Mall

Auto.com

The Charlotte Observer

MichiganSports.com

LOTD2GO

WHYY Philadelphia TV12/91FM

Tomalaks Realm

mediaUK

Bible Study

BrightHand

Internet Travel Network

rec.humor.funny daily jokes

Smaller.com

Stock Smart

The Register

The Sun News Myrtle Beach

TV Guide

Universal Thread

Weather

WRAL OnLine

Japan In Your Palm.com

VisorCentral.com

\end{rawhtml} \begin{htmlonly} \section{In French} \end{htmlonly} \begin{rawhtml} La Lettre de l'Internet

\end{rawhtml} \begin{htmlonly} \section{In German} \end{htmlonly} \begin{rawhtml} PDA News

Der PocketStandard

Heise Newsticker

Palm News Switzerland

\end{rawhtml} \begin{htmlonly} \section{In Spanish} \end{htmlonly} \begin{rawhtml} InfoSPIN Mxico

iBrujula.com

\end{rawhtml} \begin{htmlonly} \section{In Swedish} \end{htmlonly} \begin{rawhtml} MikroDatorns pilotnyheter

IDGs 20 senaste IT-nyheter

IDGs IT-nyheter

Computer Sweden

Computer Sweden, Teknik

Computer Sweden, Bransch

Computer Sweden, Allmnt

Computer Sweden, Mobil IT

Computer Sweden, Skerhet

Computer Sweden, Datasystem

Computer Sweden, Windows

Computer Sweden, Unix/Linux

Computer Sweden, Hrdvara

Computer Sweden, Mjukvara

Computer Sweden, PC

Computer Sweden, Ntverk

Computer Sweden, Microsoft-rttegngen

MacWorld

Aftonbladet

Expressen

TV4.se Nyheterna

TV4.se Recept

TV4.se Sporten

TV4 programtabl

Dagens Industri

TeleTrade Palm

Dagens frestelse frn Arla

WineLine

Swetramway Kalendariet

Swetramway Nyheter

Swetramway Text

3SAT

Animal Planet

ARD

Avante

BBC Prime

BBC World

Canal+

Canal+ Bl

Canal+ Gul

Cartoon Network

Cinecinemas

CNBC

CNN

Deutsche Welle

Discovery

DR1

DR2

DSF

Eurosport

Extreme sports

Fox Kids

Hallmark

K-World

Kanal 5

MTV

Muzzik

National Geographic

Nickelodeon

NRK1

NRK2

Rai Due

Rai Uno

RTL 2

RTL Plus

SAT1

Sky News

SVT1

SVT2

TCC

TCM

Travel

TV 1000

TV 1000 Cinema

TV Finland

TV Norge

TV1 Finland

TV2 Danmark

TV2 Finland

TV2 Norge

TV3

TV3 Danmark

TV3 Finland

TV3 Norge

TV4

TV5

TV6

TV8

TVE

VH-1

ViaSat Sport

ZDF

ZTV

\end{rawhtml} plucker-1.8/docs/SpecialCharacters.txt0100644000076400001440000000040507345561051017121 0ustar mickeusersThis is a list of the special Palm characters used in formatting of the Plucker text -- these characters will have to be translated to appropriate equivalents for viewers in other languages. 0x95 -- big dot -- used for top-level list bullet (janssen, 9/5/01) plucker-1.8/docs/GPL.tex0100644000076400001440000004343007712230706014147 0ustar mickeusers% % $Id: GPL.tex,v 1.3 2003/07/31 15:12:06 desrod Exp $ % \chapter{GNU General Public License} \begin{center} Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. \end{center} \section{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. \section[GPL Terms and Conditions]{GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION} 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. 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. 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: \begin{itemize} \item You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. \item 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. \item 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.) \end{itemize} 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. 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: \begin{itemize} \item 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, \item 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, \item 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.) \end{itemize} 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. 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. 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. 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. 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. 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. 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. 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. \begin{center} NO WARRANTY \end{center} 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. 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. \begin{center} END OF TERMS AND CONDITIONS \end{center} 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) 19yy 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., 675 Mass Ave, Cambridge, MA 02139, 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: \begin{verbatim} Gnomovision version 69, Copyright (C) 19yy 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. \end{verbatim} 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: \begin{verbatim} 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 \end{verbatim} 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. plucker-1.8/docs/Makefile.in0100644000076400001440000001156010027064212015035 0ustar mickeusers# # $Id: Makefile.in,v 1.21 2004/03/20 15:51:38 prussar Exp $ # SHELL = @SHELL@ prefix = @prefix@ top_builddir = .. subdir = docs srcdir = @srcdir@ VPATH = @srcdir@ DESTDIR = PLUCKERDOC = Plucker_Doc USERGUIDE = PluckerUserGuide.pdb MANUALDIR = $(DESTDIR)@DOCDIR@/manual MANPAGEDIR = $(DESTDIR)@mandir@ DATADIR = $(DESTDIR)@PLUCKERDIR@ IMGDIR = $(srcdir)/images IMGTYPE = gif L2HFLAGS = -image_type $(IMGTYPE) -short_index -show_section_numbers -local_icons -address "The Plucker Team" # -split 0, to create a single doc PYTHON = @PYTHON@ LATEX = @LATEX@ L2H = @L2H@ MKINSTALLDIRS = $(top_builddir)/mkinstalldirs PYBUILD = $(PYTHON) $(top_builddir)/parser/python/PyPlucker/Spider.py SED = @SED@ GIFTOPNM = @GIFTOPNM@ PNMTOPS = @PNMTOPS@ TEXFILES = $(PLUCKERDOC).tex Advanced.tex Credits.tex GPL.tex Introduction.tex \ Parser.tex Quickstart.tex Viewer.tex Links.tex PluckerDB.tex PPI.tex IMAGES = Bookmarks Category CopyURL DBMgr EditBookmarks Find \ Mail MainScreen Prefs Result TapAction \ chicken-head Autoscroll Gestures HWButtons all: $(PLUCKERDOC) $(USERGUIDE) Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status $(PLUCKERDOC): $(TEXFILES) @if test -x $(L2H) && test -x $(LATEX) && test -x $(PNMTOPS) && test -x $(GIFTOPNM) ; then \ echo "Converting images..." ; \ for img in $(IMAGES) ; do $(GIFTOPNM) $(IMGDIR)/$${img}.gif | $(PNMTOPS) > $${img}.eps ; done ; \ $(LATEX) $(PLUCKERDOC).tex ; \ $(LATEX) $(PLUCKERDOC).tex ; \ $(LATEX) $(PLUCKERDOC).tex ; \ $(L2H) $(L2HFLAGS) $(PLUCKERDOC).tex ; \ cp DBFormat.html $(PLUCKERDOC) ; \ fi @if test -d $(PLUCKERDOC) ; then \ echo "Changing GIF images..." ; \ for img in $(IMAGES) ; do rm -f $(PLUCKERDOC)/$${img}.gif ; done ; \ cp $(IMGDIR)/*.gif $(PLUCKERDOC) ; \ echo "Converting HTML documents..." ; \ cd $(PLUCKERDOC) ; \ echo "# First we remove all the WIDTH and HEIGHT attributes for images" > .sedscr ; \ echo "s/^ WIDTH=\".*\" HEIGHT=\".*\" BORDER=\"0\"/ BORDER=\"0\"/" >> .sedscr ; \ echo "# and then we replace the converted eps images with the original gif image" >> .sedscr ; \ echo "/^ SRC=\".*\.gif\"/ {" >> .sedscr ; \ echo "N" >> .sedscr ; \ echo "N" >> .sedscr ; \ echo "N" >> .sedscr ; \ echo "s/SRC=\".*\.gif\"\n.*\\epsffile{\(.*\)\.eps.*\">\(.*\)/SRC=\"\1.gif\" ALT=\"\">\2/" >> .sedscr ; \ echo "}" >> .sedscr ; \ for file in *.html; do \ $(SED) -f .sedscr $$file > .$$file ; \ mv -f .$$file $$file ; \ done ; \ echo "# Fix the superscript in the title page" > .sedscr2 ; \ echo "s/Palm OS\(<.*<\/FONT>\) handhelds/Palm OS\1<\/SUP> handhelds/" >> .sedscr2 ; \ for file in $(PLUCKERDOC).html index.html; do \ $(SED) -f .sedscr2 $$file > .$$file ; \ mv -f .$$file $$file ; \ done ; \ echo "BODY { background: #ffffff }" > .css ; \ cat .css $(PLUCKERDOC).css > .$(PLUCKERDOC).css ; \ mv -f .$(PLUCKERDOC).css $(PLUCKERDOC).css ; \ fi $(USERGUIDE): $(PLUCKERDOC) @echo "0:-:.*chicken-head.gif" > .exclude @echo "0:-:.*.png" >> .exclude @echo "0:-:.*prev.gif" >> .exclude @echo "0:-:.*prev_g.gif" >> .exclude @echo "0:-:.*up.gif" >> .exclude @echo "0:-:.*up_g.gif" >> .exclude @echo "0:-:.*next.gif" >> .exclude @echo "0:-:.*next_g.gif" >> .exclude @echo "0:-:.*contents.gif" >> .exclude @echo "0:-:.*index.gif" >> .exclude $(PYBUILD) -v -H `pwd`/$(PLUCKERDOC)/index.html -M3 --stayonhost --zlib-compression --bpp=2 --maxwidth=150 --maxheight=250 --alt-maxwidth=500 --alt-maxheight=500 -p. -f $(USERGUIDE:.pdb=) --exclusion-list=.exclude @rm -f .exclude mostlyclean: rm -f *.log *.dvi *.toc *.idx *.eps *.ilg *.ind core clean: mostlyclean rm -f *.aux rm -fr $(PLUCKERDOC) $(USERGUIDE) distclean: clean rm -f Makefile maintainer-clean: distclean @echo "------------------------------------------------------------" @echo "This command is intended for maintainers to use..." @echo "it deletes files that may require special tools to rebuild." @echo "------------------------------------------------------------" install: @if test -d $(PLUCKERDOC) ; then \ $(MKINSTALLDIRS) $(MANUALDIR); \ cp $(PLUCKERDOC)/$(PLUCKERDOC).css $(MANUALDIR); \ cp $(PLUCKERDOC)/*.html $(MANUALDIR); \ cp $(PLUCKERDOC)/*.png $(MANUALDIR); \ cp $(PLUCKERDOC)/*.gif $(MANUALDIR); \ echo "HTML documentation installed in $(MANUALDIR)"; \ fi $(MKINSTALLDIRS) $(MANPAGEDIR)/man1 cp $(srcdir)/plucker-build.1 $(MANPAGEDIR)/man1 cp $(srcdir)/plucker-decode.1 $(MANPAGEDIR)/man1 cp $(srcdir)/plucker-dump.1 $(MANPAGEDIR)/man1 cp $(srcdir)/plucker-setup.1 $(MANPAGEDIR)/man1 cp $(srcdir)/pluck-comics.1 $(MANPAGEDIR)/man1 $(MKINSTALLDIRS) $(DATADIR)/palm -cp $(USERGUIDE) $(DATADIR)/palm plucker-1.8/docs/Introduction.tex0100644000076400001440000002141707712230706016207 0ustar mickeusers% % $Id: Introduction.tex,v 1.9 2003/07/31 15:12:06 desrod Exp $ % \chapter{Preface} This manual describes Plucker, an off-line HTML viewer for your Palm OS hand-held device. Plucker increase the utility of your hand-held device by letting you view web pages and any document that can be converted to HTML or text. Plucker has many advanced features including the ability to read web pages with embedded images, an advanced find function, the ability to open an e-mail form when tapping on mail-links in web documents, an impressive compression ratio for the documents and an open, documented DB format. It can also be customized for your specific needs. And not to be forgotten the source code is available for your perusal. The general layout of this document is as follows. First we will list the necessary components you need to run Plucker, and we will give you a short introduction on how Plucker works. Then we will give detailed instructions about the installation on your system if there are any specific parts for the operating system you use. After the setup routine of Plucker we will show you how to customize Plucker to get the contents. As a general guideline we strongly encourage you to read at least the first three chapters of this handbook. When you understand how Plucker works it is easy to set up the advanced features using the reference part of this book. \section{System Requirements} \subsection{Device} Plucker will run on Palm Pro, Palm III, Palm IIIx/IIIe, Palm V, PalmVx, Handspring Visor, TRGPro and other Palm OS hand-held devices utilizing PalmOS 2.0 and higher.\\ Plucker requires \viewerram{} of free space for the viewer application and an additional \libram{} for the shared library if the ZLib compression should be used (only PalmOS 3.0 and higher can use the zlib compression).\\ Additional free space is required for your data and at run-time for decompression. An alert will be display if there is not enough free space on your device. Note that Plucker can use documents stored in Flash memory and on read-only expansion cards.\\ \note{} The higher bit depth (more colors) you use for the images the more memory they will require, so it is recommended not to use higher bit depth than necessary. See below on how to influence the bit depth Plucker uses. \subsection{How Plucker works} Let us start with a short description on how Plucker works. This will help you to understand certain procedures necessary to use Plucker to its best. First of all let us mention that there are three parts: \begin{enumerate} \item The Viewer: this is the actual application you run on your hand-held. It is used to display your documents as the name suggests. \item The Parser: more or less the brain of Plucker. The parser gathers contents from the Internet and converts it to a suitable format for the viewer. This part is installed on your workstation, not on your hand-held, so unlike other products Plucker uses your powerful desktop for the hard work. \item Some transfer tool which sends the pages you gathered using the parser to your hand-held. Actually, this is not part of Plucker itself and how this is done depends on the platform you using. For example, on Unix or OS/2 you might want to use Pilot-Link whereas on Windows you might prefer to use the HotSync Manager. It is only necessary that you understand that you must transfer the data in any way to your hand-held. We stress this here as many users who converted from some other application to Plucker missed this point. \end{enumerate} Consequences of this are immediate: \begin{itemize} \item \textbf{Before} you are able to view any page from the Net on your hand-held you \textbf{have to} run the parser (sometime also called \emph{hotsync} in this document). Normally you will invoke it via some script, which we will explain later on. Even on Windows Plucker does \textbf{not} start the gathering process automatically if you press the HotSync button on your cradle, as some other off-line web readers do. We want to stress that you \textbf{must} start the parser manually (or by some tool that does this automatically for you), and after running the parser you \textbf{must} sync your device to get the documents onto your hand-held. What sounds a bit difficult offers you in fact many advantages. \item Since the parser is separated from the viewer and the transfer tool you will not have any problems if your HotSync-cradle shares the COM-port with your modem. \item It is possible to run the parser automatically at some specified time. That is you can have Plucker to collect your newspaper each morning at six o'clock without requiring your attention and then HotSync the retrieved data to your hand-held before you leave home. In fact the whole process can be automatized using e.g.\ cron jobs, by a (shareware) tool like \name{AutoSync} from \textit{\htmladdnormallink{http://www.rgps.com}{http://www.rgps.com}} or some similar package. \end{itemize} \subsection{Converters} Before you can read a document (HTML/text file) it has to be converted to a Plucker format. For this we need some \emph{converters}. The provided parser tool is the most essential, but to get support for images as well you might want to read on as we need some 3rd party applications for that as well. That is, if you lack images in your gathered web pages most likely you are missing some of the necessary tools. The provided parser tool currently runs on Linux, OS/2, Windows, Solaris, AIX and FreeBSD\. It should be possible to get it running on any platform with Python support.\\ \note{} On OS/2 you must install Plucker on a HPFS-partition. Plucker will not run on OS/2 if you are using the FAT file system as Plucker requires long filenames and OS/2 implements the traditional way of FAT without the \emph{extensions} known from Windows.\\ If you know of other platforms where Plucker can be used successfully we would appreciate if you send a message to \devaddress{} informing us about it and if possible also include information about additional requirements to get it running. \subsubsection{Additional Software} The following tools are not included within the distribution of Plucker. You will find a list where to obtain these tools below. \begin{itemize} \item \iname{Python}: a scripting language. Uses in the parser to retrieve contents from the web and put it into Plucker format for the Palm OS hand-held device. Compression of the documents is also handled by the Python parser. Python is {\bf required} on all supported platforms. \item At least one of the following: \iname{Python Image Library (PIL)}, \iname{ImageMagick} or \iname{NetPBM}. These tools are used for the image handling, but are not needed if you pluck all your data without images. \item Some transfer tool to transport the retrieved data to your hand-held. Most likely you have this already installed. \end{itemize} \subsubsection{Where to find the required software} Where you find the tools: \begin{itemize} \item Python : \textit{\htmladdnormallink{http://www.python.org}{http://www.python.org}} \item PIL : \textit{\htmladdnormallink{http://www.pythonware.com/library.htm}{http://www.pythonware.com/library.htm}} \item ImageMagick : \textit{\htmladdnormallink{http://www.wizards.dupont.com/cristy/ImageMagick.html}{http://www.wizards.dupont.com/cristy/ImageMagick.html}} \item NetPBM : \textit{\htmladdnormallink{ftp://ftp.x.org/contrib/utilities/}{ftp://ftp.x.org/contrib/utilities/}} \item OS/2 versions: Current ports can be found on our web page at \textit{\htmladdnormallink{http://www.stellarcom.org/plucker/os2\_bins}{http://www.stellarcom.org/plucker/os2\_bins}} \end{itemize} \section{Conventions} For this document we use some common conventions.\\ \begin{tabular}{p{1.5cm}p{10cm}} \option{Bold} & is used for options to commands.\\\\ \name{Italic} & is used to indicate files, directories, commands and program names when they appear in the body of a paragraph.\\\\ \code{Constant Width} & is used in examples to show the contents of files or the output from commands, and to indicate environment variables and keywords in the body of a paragraph.\\\\ \indata{Constant Bold} & is used in examples to show input that is typed literally by the user.\\\\ {[ ]} & surrounds optional elements in a description of program syntax. (The brackets themselves should never be typed.)\\\\ \end{tabular} \section{We'd Like Some Feedback} We have verified all information in this User's Guide, but you might find that features have changed. Please let us know about any errors you find, as well as any suggestions for improvements, by sending an e-mail to \devaddress plucker-1.8/docs/images/0040755000076400001440000000000010052664561014250 5ustar mickeusersplucker-1.8/docs/images/Mail.gif0100644000076400001440000000211207146467415015623 0ustar mickeusersGIF89a,`Hinʠ (Keo%@H<ˆ\T#>Smrb赻^675W'ݖW7us7Wx(Yɨ ㈀wIj%ک8U4+[K+|\<|Z-=m}m] >+N~i?-C/=`%L z%|pXr !^,T3ZU]$W*xN΂7O^$`sU"C//CQbaJ[r5,رb˒=uTlm 7[qֻ:.t57߿%.jH fq@٬̜7{Ƭ2fH5YYJ[ODZYmFGߪyXDLg?ѩJ7u~ p9:oiT!E 8=4)/sʮ {zṟC]3y`{tX$Ɲ${Gin6^g"~F"XLr͝vZ,6"e.ƈ4rh#T<#v(d9ݕdJ&ۡVd]DFʔTX=Yvi$p)fdߗhb9Qn:fp>{iy'Pxi柀9vs桱)jޑs 飒n5Zz)i*ʐ觫 jj0rIN *j֚lڭ:lŮzlʬ:Yi*mpNْ~-j:.:R 嵁.ʛ!Ֆk)([.tJ ck09y1=GsXؖ75\.

qR o`"K&W) ,k9p5{w.SߨNu~K웻nz{OGl˷Q;4ųVf> ~G ~̊=u}n c.:az>!!H(qWȑ*f͍lxJͯrkP6@ܠjh-hՁ e1GNҷ)F*u8} Q#UM ($I̡Yw7ąSTbMbB#j$5KsC*fa ЊsbhCq}1~(JxrD\#VN*dCܙqhԣ%j푤+)}[J S4g YZE ;NzXw-V IHS6N'SPMJ׈bFo,+)aik3XMl-3,i}@32?yQ`h9Zrsg:Nl6~^Ge{) EGw1 ;i˷y+MoYxwG~+T췝}W7)Gv`$6}z|ח|ԀD2})-(~#h-';+肴Ue%whwm2d4"X;E҃A8~tD2KYu_B91kDJQѢY,Vx?k.THDRqkV5xkMT(ZJWW%n6ՆgWk"bZƆ.oWG[#,Gi2(VeA{(%{""y3 b0v(2!Bx)H~-zX_dNjLH&-P$o-gv%EW3@e8=iF2o~(5SKUKj8OvYC7U(|-yxoh1"Yޅ5ls4\s!AFE̸ y3"G׉XQ2)m _IN4!<.g)R-smT7xoCn=Z Py0oXEOYt8]lB"Xd>Im n)qItl3WdvwTGSu9/Y}fJHzcjrÈnx×Fd 5XJ&eILX'%F%U99b$nx"jق!_;p|h: N™k"VWy ,Û sBHѴ_'#a%czWX_ $KYՇm3YXrd,p@wWWA5ֹvFW'WrI趟B&-%H3zDgbf0~a(*&2ʍXVGBtPC sFStm&lz9*{敨Dr+gAWq^)R`Yb%Kd`G"]%kJ 24Z[239*ygIsa_tQD vpDi7ac5<%/$rzIvbARb2G#Бe+ t!lD!@7A^z KB̺ .4Vµ_SGȯFmkZd6lQu::C^+4/ U|} cllӉjXJ55v;ӱ⺷۪ws򷱈lխ3Mfz::ʪKP‹* Ģ,*D[BTtVܮ*C8К3zMl[ yg_7(WgFvv(əTi& Iظw ˊ;eY˛)7Z{w̻|E7ױ8={Sl{m ZEq4)JX-trS} \8a!3츲 v1Ѵq=ИQ|D@#ÝWs β~vf)ObXɐX8naOO:xVtS#g_w{~!|Ez^6h\i#{[r+hz߉ކvmֈZy!wnH x|`k .GP]7k 5"HE($fa$D6EKu^E"яa%tdLQlGlHios9vHށUwrV&foR} {DJi~IhW~"ʩJQ[ivᩯ@祏n'6GZz*ZZ$-"bqjlJa&,h:nok$9/6S_f,lYJeNF i0 0ZB g VVXۦLJ6*WrkJ쭁5{$I?lΐz MU,1A{l̎|_6.|h=57g.XGZݬԀ=7A{ƴ$+4XwP)P CxXnޗ'>kHR;kwWZ՘zG*2lЌKL|nOD+5fc<ѧPd;;EգtT^zyZP@ȴz@P8qMre@ RI?NC&N._<<9'!4aP}DZ4jS }TW!NvR}b R>D4Q18GBdT?-0Z"8 VzE)/^ k8F#^jVdH¢,}!H7*l60Dd6&Bpbt#WA? #g,wh 8I-ly$/(2g% ]fb_ ib K9d$6`t' ṵx(xfz l%YUg6AGQ mFW)E'jΰa!?O4c0@k\QË/g6K!j7*SΔ@(QR&RJU't4p O9ӏ5Br͠5jcm%@*u-zj|RjWRu~z$'WU}*_{ب&A >B4nfYx2?`'%)C]ϖvT,ijˢLmRybi[[V%.]wg߶č.VZwsu5wqK[瞗tɻJu,d+Άv'"jyWiuz^+[W ~fx֏mi.ߛR |A_X _ e8i)\ x4vp1l[sJOVY(1dV[s'[0CY7p,kq1Ռ_9tsKٓAo^G32Y\A\l=LWX5s?l?9GuM[)}]zg)}Y??>45R{ÿPo?;5?&n*Z7xNGvRa h{R'xpwAGX ؁tc|&q{7P)~F+FE,cx#0Pc4rJd=8a76KGvIxP55 UR8AIGS:8;^@p0 ^ThwfDpo+vxfceX j\Tu+цx PGLaXsyG{Fh@C9hP| bgxpKxwUiGl1~؉wxx_膫Hqd(⠉8s~7JhXtx7R8 wUzC8@X VDƈ ĄRXHyqӨ8ӈ|W}Y%i9;w(Xem6]"ns~}VjxW$-R !XT]PmC')=# X|+)-9L +;l:|C|)IGY;plucker-1.8/docs/images/EditBookmarks.gif0100644000076400001440000000153407146467415017506 0ustar mickeusersGIF89a,B޼H%ʶ GL 4:`G52AYaIG,W9,1qvMWTmesm~'WuGWEIgǸTكǨىuiFY:8igzHKx[C[,9\l,d{ \Kvl'Mvt .6֦]Μ]N Fߝ=n _~h0u+b ;z2MD<2%*[|%̙4kFi3Κ8wy'СD+-4HuJ:HTGZYVYzMؐaǚXZ i׺mGQڅ^q,cjĊ2n<1䧒'7l9)E7sТw.5/jWl횫Zani6ٺm7p+n#h39'P~3:v׷;|9<5}o^}{t>7 s&wq  p n6!mvk!jh!~6"g%fve)N"d-6b16#a5v_9^=]A5\Eu[Ie^{5nEiӒjY)8m {T"ai)&HB݀W):2UqHWpOoDFѧxNItd_hh">hj|(~zPCaZZj)?E#HB驠%*w2$>Q ,u$1ްKF^j-J*#i*'ɺe")o S;plucker-1.8/docs/images/MainScreen.gif0100644000076400001440000000710507350172450016761 0ustar mickeusersGIF89a|,|ڋ޼HFfkL 㵀= =dSJԟj.wPh6R춻#X^zM' (8fVW7)9Shhg4YvIYjzac:#Zk{{G+*xx;<6D{Ak'L]ɗ<{j(mY"8cۺ??=T~BdۀQ\{'i)|VQQ8φzAքוpw RBcG8>XAMXhb@giƓAfGKBɢuQUaHcroVM乳m-`ih%ͷP>&f$r,gefezb5>k^)1m"J*J(i'텙=g}cLxbTjf Wc7&~ºjJU9%5<Ȇ3Un٬ʵH]I^s1j,x>nr-nn땹n޺/;0&,e;ykRpj!Ol N+w+p K¿Ș} 2E 6sn@ z8~<˾Ң/Lnf^@($xIWE*Y?gJZ-8̜bݷЂ\GNS|W߂mWM+Sݍxbۙ_%ѦSo蓬6WwvR{k6RE |O|Grh}|+t[plKm㥎kt#<*gkvP GڻTqYv"pm|y;` h^Yͨ|bc U w9iM0RK/, jzr8VsRorW6.Ds˅-L0wS0&O Ae/nTկM1< 7EɌg `\<)R0ld.IarcZ)!) rQ}эg^K,%z4L6jJT!ZFWΐe j4; xSl܆vF(✧? Ѐg ; ]hC/@DEm5(,ЉSL^>e)<Aꨨ|CG])oH0Оi49Rqt\Ig:@jg(RX<Z-p' 3"mSoyU:er[d`!b\d-k)*D^9ի,\ҭx9+Aɕ `{Vf3k%ָ:V~ݫbAXu,ZyX,@-Wf R'MXMS鴐,hHlj]2sSt۟ʪ ,i;[lEK]J7Uv-ݒ)-Fi[e}wx^[[׺MjE߭tta+ck. ΐg\ivɭ+Cj+H WE1N:R3/b٠8Lt]qDtYHG`|*S!cKCF2N3KN @GY+IsV6D)se(F~&!0^JazRg@'x~j|3z)ӎ;/ unqGh-:^AJ?tx|^LA0.4KѰ$īk2kCI֩*iLҾka.FpTz/*ce0;nw2yC;6u'J{kti)Zq,zҬl8ߋ47oטYaQp<:75_؛dmbz9T35Yȓ=&\FyQ9BYSENZ:OI\ٕ],XYYX0biZMiQ9hf&b!؍5ƅT@knΡ]Hq_؄ƈVT8\&VGTYC(E gC9_9)PM>uf•otJ_ɇ5gWurBc)DIŹu}3#SJ՛י8uhkWNOH/YV Ŏr:\E%.z2iS홓g1 kE?%#[E~2/j'rqWL7S݅&nu[pvXbHY=)h:ZRj@F鸍eKN Ry<R:zXi(.>ۡ5j(_ڏPʔGjztʊIO ƉzDxYi rNI]:L&S ~ = *?娕j2ʩ꩟ *Jjʪꪯ *JjQ;plucker-1.8/docs/images/DBMgr.gif0100644000076400001440000000701007350172450015663 0ustar mickeusersGIF89aT,T ޜHNʶkkJז] cžC 9D(s7|j?) ̈́-w1(Ȯ[F_,Uf&DW7rI%YėwrVWع8hj[k&8; zz:)6khK;}G;mk*Kz}6l{1\}L9I}ld~t̄G ;] ɵ O!a 0+/zDG/X=DJKlƁiTux5$7JI Y BvdfH, g:сG4J限$t5Τ,8ˍ>Օj*UFSoD} ם9=n76 ӾrC2e=aqѤ+p.:լh {tٴkۦݼ KFcMM2&RTŅ(<;Y#iܞ(L\앸> H4(̸b2\ IG Q7/WB(jRMvrQ842ј$~iF[=7C}L]7 *^z๧ys JC)(C89]*-mcn<t'HR9FmCSd~]ۓn҃G*JwT[S%rj|XIR6jU&:`Z*Ti 6i3)+bYVq t1=5Dkm>HTQk0kA]E:t<}aF=S[*d6BĶ={q/RĖ*M*TfpoiD>xWvFşs:妥 {Z[6\HZ! .#f\U,p eti+/+\ T1}̗~JJuX 8{c/D=^{MJZV(=Kʈ؟~,Ҩ=Z|3B ^♗=VT"oݜRN-"!hNLwE"Ih l8]-t17#Wy.B*h3v4ߑa3c{g4@d]"Kr;q%9tts('iS&݇ayQnzW>*žkGc{9ldZ~o^˽.95,4jgRɱR̜.cmI7UIWK-G݀׌u7l*x? /j Rq-V95OkL,dk--kXfIO_Z@9bP}q>mXkR3GCnM;yʳ\/w>}tђ̤b}g83.+FĖ+] ڋ"S/Y+ui7pV;\zKW+XRjMuwwVI>V-ɸnyۛ\W;w, eԳ;7I; zٗBǁ/5Z~npLc̸Sh`v^ ODs4bMܨXBj5j݈w!ABVbmka2MC9YeX)rنUT馂.O'Y%/h\(_iCl(W(m}?xꅒ*I55 k8;ؓd3?I\E _;hKi.'OyR){7I;U%ʴhv"~<Օ$gNlyUd]H镲RmI@6 1SV"{ d/Vp@Mx)q1U郦__96yeasMAT&9u1YFv!Fhl:5^"ᚭV$Dj،ˣm_]ze¤mʩfל$hTuVYZW-w3 NY9 9?șxhY%UɐHD<ңqf)!h6_Y۩#yis}#QYTWXH7w(;slLkN|"˄vAbfIa%y%s|i!y9IkS%V QH9yzIŶPOzazSgP[KZj1WɥFʧXҧ?Lm))P;plucker-1.8/docs/images/Autoscroll.gif0100644000076400001440000000317507544623442017076 0ustar mickeusersGIF89a,Zs HnX~ɢw9eBBœ+b bC5 *gVvzᖵ"41[M{\$gXF'wǥ֥G$7fgXyؖ7xv$eӠfH*&c+Yg &2[Iy7hlTkgj|l 3L/gڼ^͜<{ڤ3П=rҥLu*m 5BT&U5Npm ƱPjăժav%E RߪyVM BQU.|3VBcUIeZlia>w ͼWw]2#[.s37覎ܹ^{Cc3"cv_Iwu` H``#!`NI^" eHSF(Iq&ε!(4dM>РFmF &Bآ!7u\c#HP*J^b&QB^Ji办iiAbɡ[ ."[<9OS S hJ βi5ޣv'Uj)u2g}4zWЉZLiȖ&zW'b}s ZTJ]>{ak! ASoul0ɲv%x vad43n抔"[:eݺߍHݺWFk9K#4k/qʊk%~I*? Z {nBɪ2mr\c<3@=4w4J? EB5~OPiA f0"  uWo-^k-;)ug}1K$ܾR ؊brsl sk+m]`ڸ7_Y'E+3:^>촛eQ/{PGQʆ>գvXQؖɗkzJWA9.Ugnw;|ؤ=KLz[&Y]0{Gf5⣓P3sDa=uӚx̽zN#^[=6;t K}ņB ""G\"D.QtJ(G\WkhJꞨTG鑳h:b|1_8 K[޲ְı?#ظnL m@ 2 (ATQΐԤ2.(S$MCBk`")2" T*2Q>#19hcGl3gB%Ҝ-^bܦM]S#d?9g4ZcG\p|r.ov(yV΋U2lTO?bfqoa(گ2ʟL9/lX%G.:a`(&izviNi3h '5iTD3LE Bu;*;plucker-1.8/docs/images/Bookmarks.gif0100644000076400001440000001660207350172450016667 0ustar mickeusersGIF89a^^,^^L;HbZkLn| BHL*̦x"φ*1>2~%AgwQ 0t3؇&v"H#xt6YWcAIX(E)SzBWY*6x(* &L6*:[h8Jjk Fby R{nLT>AE`\)a McOw}"\BM uRPg5Xa2[\Y'm !PԍbB!aa:k?ٖ$5LJh.HdZaU7RKcw}z!"m Krbetc9fNښE‚#ij腑_ d>OP bR~j&ӍM&.)R5?JjcJjG)ThEVYcCvkjezxQ rjWz.ٜ&_Wib)5x骼;n&Z]b zșɵl?-b&Hq~9_,15˼du%G*U>6(Ѻ6S 7ӻsABH/2 5'uլ(V3M[-M6yFMvץajSNu7O-l u 4#uۿށw}SGR:ZP'z3%Wb.Rs6K,̺Zm>(Oҥe-r KSk\bF[_v?=.SiWq1gWeF<d0{+Nb~ۓ^{U+[1_g@jI0P{7ɏS炤P{jg+dd!C\>UʃT9ZXץk1jG+v.`8jkd7-kiTڸ5= QsݖQno#&G1f#mG1)EN:?e6;<ʑH 풉&0 #8Ҕ\OyTA2u cӾ? "(Fx J&?Y-w5>X>V֝sT T:KIK*rDa _N49Y%e Uu`eiDv U9kv2]Q'IhL >a(Mԟ2 !iSN3`~)LיQꬡlY/"ycU(F[)7%TnH*Tt&sDXS=QfU&*:S$gP ei<88 KV{me,mWql#(-73xi 'x.mj4?rMAR Z]6ͯb3R-fZ!/8 WUdp.dsneWǢ[ $ôz}r'Xk=$x02b]ři{* 2Ӂh]鮔;Rb{]~jJ׆n%c'{ް&Y !3WX>ZWF)qZpRU̳X $Mb 1;jXI>R&.[$\"Ɉ\0c$_M޲Y/sypVQV,O~ns%6-LK5 ma>QZٶ`kK&u/Z歆K父T}miBv)6͂Pb0DZuAݨCʷ!\=jQڞ);X! 9uWOI-ŤG]gZaE](Y:BuuH]٦;$`$Xt7,36ְAGOZq~5MNՎN6 谙]X^T.6_my3̲Gk*_994i]; wLUTi)?ϘYvdtwBN(WӿoVڨzE+'c/OЊY | \VkNEŘN"ڎc0Z͸!BX80/;CT{'#Q^NŇpW.ix0Y;&pKSQ0E?05y_p68)^ɞ~e]r.DŽh?O5FǞF5=|_l % ˋ}H<^Lp?q5dG@q5r^V77 e esnUwfOes؁Fs!tWK$Wɇ7%v%҂A@X1t+418(Wᕁ]7v/(mkD2u}>Wesu6p(nMߑE%whYijQ"<'1e}YT[wg+1a%w[y^{t7b@gx4OHZEOE~HmAƈ`RS-(ŷvPŖIu_5uFv /mglQaȄV[5TvCjS&gA*Lh@Dn}}xHH~ z<\H[Ztq)UwVyȊ t|U!<腾DBbn?z6\XPwJiQ8v؏ɁI%)e yars4rd&qUuuv7;$,+C6 nwZ Yf6fsC%)Z@vG~b^2%,9IUZHhfFr('&h3`F( }Bmni8nR9b/yږ[h47|;tTQ>2c?Xi!w1LR !^iOY'~–طi:DV m4 Ujc6l19-V@W?0D.>Nd<Òx1 Pvdu.2Tb?}CiXYyy9: I隄r\epy=91ɚnmivZu{7]R2X$ҍxgؘ\ )9tӌA(rɟ< \{›ɝٟ JI};@ƓL̦~(_GEClJX ^E1Ƀ{Ƣ2(C6Mv|xr9;:J=٤ɤQ:iOT ى.i .xw"ne'8g>z6hr r,{@/YN"+Z1 .GzhEZב,L[3If冋6(NۆZ{z oՇx0֛n*Dbq膸een9Tp8TΆfpEGDa VloKRUk;"*若}t;Uk굞vkX{K OVU{e˖3`: iidp1FYȭ#Krbk;Rʿb2 \̸Br ѕ5|R5.kL•6;\2-܁"ˆ#j8ko`JLk*2CL4BMb2;LB3;j\ I9# hY,:c,aDܨi|\qykǼO;ŜgPߋ)-)oh;Κ-5$;,|#0fs&ԙ"C>Aͬl͵eRαĚv[K4976l!ϥ,M= ="MƔGE&ܝ<l 1 \ӗõ d_˺ W\gM*mW7Kȼ@G'Üi,-k/ݣ9U<h;*W%ˋ;q=ָʡt:ԘWxHUҾ{%ԦatB]^xحHU6vc=[,p80 u^ֳwt: 8ۮ]ȹ;3ڈk5SнFjwم jMZdPuY9=<̫ax0v=w\+T$oJtYswb{( yz5S}8~6iwi7^˕w'V9K`'~kɵ;݅7n7oj6)DLNȪ$~Kb`,Jwq.^I\;4Vc1fhҲ LN~*g 4zɢ l>Cw`I'aj8~MNԏO,aARE](iٓLW]bZ8QX٨eoa|@͙x֔3.π5gT➗'/Zӈٵ槖Gkz-4|Ky˂4xm;ݨ* ӝO˸[֭TJoN}%I>}mپ$} ߑi΢˾9!RFyf%KS-{Oxt1XvZ~f˹}BXшqUiڮGRm<}ca5Rr{p` HTzsZ;ꍌm7W2*PVhdtu [ Ztj >z,PIF>|,_*xi&NW4WYvO}C[l5Ȟ֮7Fߴ$JnxѢ8よubvxf"m1bvv'5a ;f"C AQRZ_T>d#oWIg:MeU=PM>x" L5-gK,Q0ȑh/2pRrfSt25C&4UtV2VOWrR0(TŸW2x-x9E{ {Tm=<$^CkoyϝU1| ݿ$ v*8>P>#-wRdI7\5 VxccAδXPrnWhHl3oIMaLR/ӄ ~sN9Ne R#FT:5yݟ1I)G7 V_/k 'R:=uҩKug7Z6k:l w+rԪ dɥFo,]7əѩc<^9Vۅ,$y>aMt =?p>uoTOˢgbl̥rjL) h>RP-@BBB; UTľ:>jp (rv2(1*H]^Zb'ct%bK7>*r/*!'a";$5k %P 3b~`kRNЫlӽ=[* = 24Lptb=ϤP+͑4s Qm5+ R4lt4+ӭhK,:QWþLpմ,{Q&dP]5-(j0Yx4o^ꊯJYY] Cɋ]2& NՔ #7SVXj`{" X4lb[ XpxA㑹dJ4\cOaESc1EU`\tUegXݛtO`4@fZS_zl-ke.<>sR!0s ǵ^y`_fpF69aR&s1)#ǻ'‡Cm 3h$s~kA\̱I;[ruBpD |mUƭGi\罼ťIw"}Tu]猫\=)p:\)ޏ;BR5sRֲ7Y (3% ,iRqAhЄF =Rt˅ITѮee=#W {&Ѵd2 h^0Lj^(Ze8kHNqҜI'\Gxst'pq,< ~@۶BfhgBn:*g@!Ln(E3 Nb eZʨ: qVJ\d` )Y1hoj9S˦?M.Qn 3]J"몢*NѨUB/^ӭjq\}#T*Ұ>A:\J95N^m ױ "ek]Ou\ΕeJ V_t3b).dieS~iD߉ѪVΑh a,A׏v!bI۟tJnju b0.]K] n$a`SloU U1?7zyMeu'_Τ~_,;plucker-1.8/docs/images/chicken-head.gif0100644000076400001440000001157307146467415017257 0ustar mickeusersGIF89afƄ!sZkB!ֽ!!J9)11ֽ1kc19ֽ!sBƵ1ƭ1)cB!ޜ1RΥckƥBB))!sck9RkZZ)֌J1ΥJ){R)!1!scJ9{BB΄Μƌk)!9ZJ!ccޜZcRZJ{ZkRJތcZ1JRB)Μ{!s罌Δ{ZތB1J1J1{R1csBs{kZ))RB9Z9kJ9!{Zc1))B9)RRR֔!k!!,f (( VJJ;O88)4U8Q4* U U*()7 MJň 44&UϭVQ!4ݿMVP84 Mc&мJJgS//X+N 4"dyW|.,(}w HJ}Mܽ|ǘh2xΝ(`R%M7r4Lv(&-PdGД+vO}M-m1`D\CWJT xPhBe^E!ˠB, QZgjC UJ &).p>M)XClٴ1)(Szj ]O`D"1V|Hn 6B品yv=1PADY6Z|,3wBX_j8}L)4 E0j4i(x!X ա(a#6R ;҂0Ѐ{6 EiRtA Ԙ=#DCLE,H׆\х163u wiy%QYPln3@6)HzZP!mMpibIZ>u֋0f:`s V*OlflJP p@ic(Upfwqg1m.V5(,wL g#@ `pI3ݠ"rA PuY< (1"M6p  põT wƨ%S) jɆ\Ps}. *Z0't*!;L(4!]{//BbX5?3@Lbg 38`7ķa׭C gwOtFW-Et+MD.RQݢs0`^DFtaDe*cZްTi䴥`cHT b EP1s @{d)Qv Dd1]4I_=򖱮J\u_XM VVOqvp~۹LlQ cS .]g a4 8@ ;0Ax.Ŷ@qU Ѐ4(Ё 8`O8eE:"E,aEq3 bQ\6$9 A&1in>!zic; )m3`BvKF20qT(Ki3l:\  n:KvӐR#;4U&^4FJGx4 6ȀTyjg*WU.΀ XTHA[ϓ,+pyQXY:u=uÀ1%G{2}g)W;KMN, 5-j5͐4^vڋ` 5/rx^5Ѐ"(U-TӃWK++arkRP08<@3`Ib"j]/IS`С fP~Ayx/^ Sdjea5;_PXf׷ l ~-,a b~`vB%xogi'08w g$ H~/e:x:&2P?&g@ _8=P18uSZnP"Z@ 0` 7>r:4Y t27ͧ( ~z!Y@ P8L 04PȞ^MW䠮v_ Sg0OR/ B.r `"ap `+@_@SgIfvgaG}7}wGr}ߧw4wx{pxtH)qzm0}WrVdIffe|2 `Ɨ7}mg  "N0{~qnP|8q*hdff5PlPP}6}((8}Cp/tG $Bn`Mw %(@-Xfw{eh7Xx$0~xg{PpC+Np0‡nnZ|$p І5kq(8x&}W'Q3072 WpShOX7un,p ? &y"W5hHj3|@md9uH|fjxd2pg W`,Pph?~Ќ8I?0In+2gX`w^x#gry(z@N 5x?`So;h̸" Pa9I@0C/^0S?,G((r|q&ygp0^`{"aiHfKw> ЗEqFa)f@(@8}1H^PCPZq@r>!g}i/xJdg-x>q 9ٚw@hLx^-u0q`m艗W&y,guim ~E9( Ќ)XZV5 lphv8JyKwktB E^ɗYX0^Вl0-z $jpwr0op?雋Qɖw?C>,1v`2FEVayE+Y `WPQSp'pddf*z`2F: `;:c(u S(q>*ڙh8}PP Kg51HkH6qF*FzLD@ Pixm^wh:SӇ't`Á7DvnY. d@u'ׯIhigzyGX0նH[6x [KB"rǞjAp%0p+Pk瘓yoA^`H+d6*;5>{Rۇdy *BȴA< 330P9 mgK{mj!1Q[!pH(}~۶mOKCrGG2jc+09KAbc00!~ 0p4 I ڨx臖;5 I+((n +2%! + jA=pbU@M!PjB@0-ڛMxM[`[v@1= ;p"[ BQb+ 3@{M9,m=@K%<_=Y7(\P*l.,]BPH<; #&0*O% mHLNE`s '1p[[vMIi,!o"8Lq<F9,rKs]D: 7 %@ɖ|%=- "@˵_\2ClZ@#P!G ,%=0b@]=51˜1&K`44lɃl>*b=,\0p`lk+Tуfro `\mt=C1Gp:)H0 ;uu ;],bpB6ݿC- Z)+%%б02|{\T2M ;plucker-1.8/docs/images/HWButtons.gif0100644000076400001440000000307507544623442016643 0ustar mickeusersGIF87a,Zs HnX~ɢw9eBBœ+b bٍ̥;k^e;'QSzӃַeEVG4WƸ6ՈSa礳j ()LjYTFHGںyˆD5kv͵ W DmK]vFJZe2<<| ?n.:l-ӟ/˻ ( '1ktiq-';z葢ȑ$K<2ʕ,%| 3̙@:*..4{HLԳE3K |3Pҩ!&N=FzuLc{5#B,Zkڹ*؄mXe`mـD;~1ϼTۍH%OC[.P}Dm Uj_-(Xmn/-Z@ygX2{x*QPafH|G~B `ڭk5:5tӻ/EJQjz eU  t"J4H``'aIAhaS1xpdh!"!tCX"i|95CWm>{2.aPͷyׅu浈S*=:drLw"RNrB=h# g,Igvމg)g~FN( j rtE=Ghn*˝ʑthJY_lVb99(L B믨ުj#nʢ3* N*C^mRa^mK+n3knIn KK- ѾJ4%Ua#,5sAy!VR[z"ʛ+Zq]\6)%^%rAǩgz^7Ǽ#YIvj&^REsS/gak^GOoDIC"\.kl-wtxge}Msx㇟;%~`7[^K@i5j >fڇS.{>.AK~`K?0{{{^ 5W.MXD8=d=._u`SbW@8E?y&:@ ?eO2y/|s]"0  ; (#ܠÊ*0`b3Ty Ia rk0af(Ap9l"P"gBhD*lLJ}U%E6'QFX\`ΝQ8':PGc- hqch G.B*Gb2ܤh:I]2$%@iʎP2de ޖL@m|-v6*1Fw 3Z Feƪ,)FR,SA&Wc34/26!IgRs9/U%yJjE3o[Ka5)-"Ҟ-?F JR)$V;plucker-1.8/docs/images/Result.gif0100644000076400001440000000665007350172450016217 0ustar mickeusersGIF89a,ڋI@gʶ : Γ ̦ JP)] #a6[d:}~8ՠEf4HȣXf(VwI u )dؖ vHj9fY٩˫E3Շ8Y 7-%ZS[Em$ |.c=|f i'-OmsNͪ?}EKL.bR[4E\%-VB!%ǑCrZf޷V2Em zaAhZdgKRib5ԡ9fHlHUcRKtfY!թ kGy@J,H+MJΌL0~;Ө!,p u[}5cMnw:'|̃<ҫ|nܺv{π{ʻģۧʼzM D@>}' hE>X0i}O(^SYSOM)xI ݈FGs 2 (#mOYc!b(࣐"8LxJQsTx]B TSL,!dZ56vhx*ZY>m֝8fiknΌo$-e|'00 CbdY[!gp$d*dɣ!RXI{h KE0z㯽5$QWZI²`/y%J u2e^ۭN涻ۦ#P[e_:,+p` ?0S[k$ GYV)Fbǎܱkr{L0.\30KXv(U҄٦^*=M6Kl^"fGt+wv ͘lk룼,R+o4-ٛ=t6g>CS=b6߂=y>wZ f4)F+v\( q祎c 3eU{Y-]yq{B`wxNѤ/j>/$ΓlWs>C~?꺙t& aq 6fK1yGAv_"Z~ٌ}4gSpS L Yf:%ӆA1+e[UAU3!H*| ĠY  lSlT.DX1oi^h(1dNY1KRD%>^.B6')e|2elrzV6[#C8.yabtF+R 70- Ok˟FE݋GsU(B$B1$0j UNě`9"t;Ϥnc.IjRU NBP&ܣ2𑨤 ?C?ӁC[nui FLMU#>92A!la;I1:埨w r{_@sQ"tndMC9}(10~ٓ>:te)_^-t\:7ĵ4IgJӨ`qCe2CXq2 E@@E; éʟԫTU 5Pn+l gDvsHb׼)<Z^XY3* ꖳ}-Ӻjm G,Ӳ$b:i#PyH~hk؂&2i CZӑ,%i`~ٴ[b5 !f3Iq1tdr.ڢw8GC̓ liPzV`3=i8Ǯp*]uچWQw%h#$Rաu1GVfG N,..}%5Ӊi^Dg8PpaO'OXU j/ҞkEs2%kɱ`..نgݩeJj|LcvEUu*{HdM؁tA*7˷,Gv/wsU)wi,i/oBr/煉iVs}oU7{t-1нkR)@Kx͇tN\wE,ٸoƕ`om1Q:n.7՞Colߺ\/T7&oNgqhU6"qXtps\};whWE~U\Ec:~dFQsh!Y&wft:dFL‚7'V6-|F}16wCN3W"EseU5 $oav·#T v`CgRJ( wE'|҅<r7sWM&DEK'zikHhx~քc2v*BENxx|/DexuXMF5m$*(\쵇և^6WE./#88HS8Hhpym;kiq]@@wv*qgd uu'7rϸrHHs&w.5c֌UXz׍+:W\k5Վ'D`긏V؏hvxXFg אȇY h9 i ɏTɸ\) 'iiI)&9_Xx8("I4`0)i2\?KiLȒXJv]חWeY wvQC,sc[G i (&eRgYSR(RSyK>d}g}A}7ѕjtuEW6eY|Y?"gDQirFi d-vx=Lْ٤)Nsz&#JefScYh74 IiI^^`~bqٙct"-h|IcWvY_扎ԟ?l*&Z=Ը% bɠZiԖxBIK'88IX5 Pr0T3Fh%54**TjZ"ij֞M |뢍VPɿpvi dwWG8hhW"t VU)jSWJJF ٱzvxG'Jר[5l ؜ku$<9k,;JVi܁ : KHkSn ?p߾˔;A݊sv0vgA~R7m#IA^ ۺFAwKf:hNN [idˍFܩw9'( n NdXe40ZISeyar5{\N% kB1ljhO鸧tz%Y8*{ZQ լ[Yٴke;݊ oċ.:kȍ;~^ԫm=$#o~[}4qû|!VX8{ N-j@I'q5F0I=SU&I~!Z,!Kb凁tcM&ՋH=Trce .Yz"1E_I]GTE(o (ڻJlކ-nJ|U1ō{s͢WuʤNyUV o2殢Kιlhj< R03E$?%bR:0p>cA$$߃$,EBmHL  (Z"Ua 7lJA|)n U1_7\R>kۛg<2eaHD ,Bj%@%P3K~ReSs~vJLܠ+ghB"xK?*ҔC(frG$%?*/K"ES vZ*XHNk8;s0ZS_e0J'B*=kB2'=eOD~?M_Hդ]vĠyQoH#’BjR T țlUۥGIT. 0 $p#/yAxK_,}~kТzHW ?鹏(rHSRiX&Z6Ȉ*آj]4B`dw%w'PLCjUU OlY|tTķUصP k},62-{v S:yyg@d^8o}Il%4'&i2V,ikV+1}cs7q Q@CGBdaLG(x.q }OZZ\h%<Ρ戆eYv3/F>+H`%O೶&fK/\%Z ,+o}Vw߹#,n(-{-n#Ri>~|Ć;h~mԫgyqm,Vջg|C_,4^۟4~{~EwvMnLr'tV&kXxcbrerWgc%x[|)ƀH-Gu s9^>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~,@*\ȰÇ#JX@3jȱǏ CIɓ(5R\ɲ˗0#^I͛./vɳϟ9 ѣ 3"]ԦФB6Jš*Vʕծ`*(kְhԹQ۩Oת,ïa5;_t׶KؾAuqŲhA"YrÎB^EbvV=~y0c CWs퉪\Q̫YoMoru7g¡O.Ͽ'?+d2M9NK~|1gy9y]W_|߂%S~re` R_xnՃ2!~gz(}&8-V8ѧ{b!>hi1!(M! ^^I5S9gY_S" }w,b W.dAa'M#RI&3&^)[m=*cZYإYJ*ꨤJ恕qinL*무Jҩ+]믶& kwy+F+-Nk&vѳz+.Վkz˂.[n[/Z)K-Ek0ߚ,gE+:$k$(NQ+kF3EJۛz,s l4!*:[7;t;ȱϬ~\9;uMӔ'rӿ& -JQ&gZF2[\dZ}aǍVJ.ܒ-_RxK e;7)u{^^]f:ݮ߉ x F_!34O垞Cf7K%7񅏽m蒋M{ujޜ5Z-.}ߺ#д~P=۬}vٛw rßz<~ƧVo>ZK`5|˝}>8^{gߥf@ί B)wsxCy p˙bg<2^$5h[8xHS!8a{WwF~F _ Bʫ~p4c K? ш G9osjܡè7Hc!YD?eTӤ<|qJ'p7z޸H0XS=9Q]&?g7^3sDIXʓE$44鷭lTf1)fqLdNÐx&⩱ѳb gOٳ'@ρ@:2T_}h*|9(FEэ=FC:\ =)Rҏ갥R`*Z&MlYzOIEl[$2S-$NEaPHLG=զUcA3[T[gQ 5INeY4ԕDlhZVmdYqiרJS$kWưrLy5'AYձ(XL5K 6;9p%TS˦Y^}M~ZQ,*x<6QDyU^}Umofy5=D\4owћK!wcZov٫Z=[BOm^Jϙ8n2I4TEw+ TnKxx&솙f` PEZan0fKUJ%%`mZ 7a8[21`kc*NI^ᔂ5ii*alQvqL2[rq 9'4uM"4u}ErGf=3:#vtiiI‚aHg}Zg FcS"VY'G]XԜnus>ׂ֬!]9*tS-hNvkl(SyF i TW5Mwa6ۂ@6{0Ti[de،+PsVVnJQ=̡5ڗ4o^E&{9Ծij&7ob,FM#V\7z3]-gjz]ڵEK ܹ)zGl݊ NyTYR 6=ٜծ=܁:ж 5q^e+=VI}3]mo?^ӽ?0g4?zTA=WmJgUizum7sr97|{ 8~ fwWOCBTm΂٧ǁoh (\Cvcx#]dy(XBR/ZQ脂ꕀXDluq~?k.:_6Kw%uH0}'$YwIA8o<XH,>hmUnADgF${xGZnP*l$V@WBB'CևZAxtt7@A]~E{5Vgv" rD!yhFzF\C ([RK+(#x9w1Gyx= _|h*yXwxM臱8U8cg8i~%f|5qn_h\aoIat%_=U}k'b؃JH~boywErH-W1)ly1}荥X\҉wz&GV`awCk#F {Zw&y&)نE818b{9Tp9 Y?M Lnw{O){N(BhDiFrH 0twE|UxWI.ȖDȕHxbȓ(iXy)7{@8~jōVjXYX2lox$X29896ɚezXmI88[]|{]HZXgYITD!C|^qw3$m9v!I>}8)y8wkw@sXEFFHׇJ(@rt4Gmi{晛I%wx'T98r4LoyHwv6wZcc8957Җy%:D<&ws*g(g)cdW@BIh4)8uMUiǛ1磿.Kd'ZuNلB(9}gYI"m{`:ؓbhfJjI@JXKکmU:)L@"0ŝd -w|n3^r-y7ũ5J9M2ujfCƥêf)X mb)1{RtSZMȗXAvrʟ W*a?xt2w6fS!vaVdž GZ 0۝ ;8KsHʨQydz+igtPֳۚ[qCyק< G8;KZ=2kHϴI7S:ZH/jgh| n۲L)ʭKyjnJ}[vq}sZnٰ#JxOx4)؊#:*۩Ƿ]F; Y{x TH2+R2˻ɽ*%Z? #.ˎij 1A(vHduAѿfLG4 Fɫk+Gg-|GYu"쿡{R)̾(4d*{H *sKK pwr kLl)%Mv6%`\_zzh\mZl<;#׻[fV\,R]w*ǃGJ19#ۑVǘ zD| ltXʜ\pJ z\˷zԸrJTl.' VnFŽ\̙\y \6_ Q\܎T͉PLξS<茚Lϼ iLlk|ka|ФΣdp-䈔M} }|ѻ&3 }*)+u|mѝ󧏩~ :^J)WjƼٌ*TyG(\P!MǷ&èsrr_MJ|g^%[Ci*MTFMx=uẉ wd~z5 $MM]KwXΙclZw0X "]2=p7D5l}j爓*۹ @x͆֊FduC:(R؈ɲMIGa}9v皬l~xyH N3C茾)sM{$n,ǻ>);plucker-1.8/docs/images/Gestures.gif0100644000076400001440000000261407544623442016545 0ustar mickeusersGIF87a,Zs HnX~ɢw9eBBœ+b bٍ̥;k^e;'QSzӃַeEVG4WƸ6ՈSa礳j ()LjYTFHGںyˆD5kv͵ W DmK]B^n~N/??Loz`L>? p]~*z4((@LYEV*J C!A iȑrbcdbA#]F43A.~CU0 z 6ؖ>ʚ=6ڵlk} 7ܹAѽ7oz/ _58^;F+II1_vůefC׵Ԩnm}i!;O,vJ'{R\"+'Ψ(H6uq-ڤL;,ߤ w;e_4*Z\yIğ|QlTzӥrEAIwP.yw};)&[fcIlȢa%#`/Hc^3ֈ#+[7$d;IdYQBJH.dER3"e!NiNJQbµډrc@5AI6dF[mYQEGR gl郗f 8iE>̚W>Z! ) )oxi15*kC֊#"ژB=U<F2k%Bf",M;m:-j+YP מ뭷u;Ho@9V"J=o o[/V 3,oq9gԾ +r$giʪxjq!>.ֲk1;ږ9\$ks47;G ClJ'gTCS{552ԁMDVj`3m$;; NVAG7ng 7rK7vvڄ;r~caC 37'ڝ]5>zi[uFzn:yz:]zc>v߮;G+A%c{k5Vr @;plucker-1.8/docs/images/Prefs.gif0100644000076400001440000000277007544623442016026 0ustar mickeusersGIF87a,Lڛ&Fk c+)"n1p!x+Fsɞ&mj[Wr$e906+Y&)&GGGȖç8Xw''99JdWZ +;K[k{ ,;l|[ =M]=+m== >N~+^~ޮ {n;c/odϏZ 4HyBviq69u&N@ YREzuҧߌ63"L.X3F>z]5Ω۷tͭݼ|- XZJ"em3:v8W@c[Z(&[1Jݑj+Qf%9cS2mћm(fNS7ڻvL{59fju48xQֶϫ//ӿ{gґo< 8q] e1(%bJg;&Wq[cI sTh҉xp9 #*Ex61L:*!q`]R<ƚw'=d!(`Zgߖuz`i٘df} F5rʉX b6{! V(cKFMtMq7fbV *l8.O<Z%BvXh,ZwLJ*MH?îkM(w-Uv%wAh^& Kv|~bnƋ&yO@ͽ{ejLfykJ!X]n+YgYqZ6{ZI2zrٛ͌n+ T$\X)kkΫt^t[LqАe^iz]3Qh[ϩv(%mw{y/ w*ތS/.>P wd(^y߲Qge(G3M0 /-Gʹ^,Br,O_Yh/d]ΏC/yWsz%wɰU4t07mvKF!I"ܹdT uAm3ZZ%;eIxaPE .y { cEq*Dx"?ȍ0΂ 84qtK- 6 @E|Y 57Ћ;5)21[QUAggb0j\#F1q#g;.z8r(¼(gQ^j\E%jɉ2Db8 D!gIU g"5:PI3 D別|[b%rVu\(c/JvkB$ a̒J _^[b#MYՌy^'0"i3h;Gws(;plucker-1.8/docs/plucker-build.10100644000076400001440000006660407553143645015647 0ustar mickeusers'\" t .\" $Id: plucker-build.1,v 1.22 2002/10/16 01:57:57 janssen Exp $ .\" .\" man page for plucker-build -- an HTML-to-Plucker converter .\" Copyright 2002 (c) Bill Janssen, .\" .\" This man page 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 man page 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 man page; if not, write to the Free Software .\" Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. .\" .\" plucker-build.1 .TH PLUCKER-BUILD 1 "Plucker 1.2 - http://plkr.org/" .SH NAME plucker-build \- generate a document (e-book) in Plucker format .SH SYNOPSIS \fBplucker-build\fR [--alt-maxheight=\fIpixel-height\fR] [--alt-maxwidth=\fIpixel-width\fR] [--author=\fIstring\fR] [--backup] [--beamable] [--bpp=\fIimage-depth\fR] [--category=\fIdefault-category-name\fR] [--charset=\fIcharset-indicator\fR] [--compression=\fIcompression-type\fR] [--depth-first] [--doc-file=\fIname-prefix\fR] [--doc-name=\fIdocument-name\fR] [--doc-compression] [--exclusion-list=\fIfilename\fR] [--extra-section=\fIsection-name\fR] [--help] [--home-url=\fIbase-URL\fR] [--icon=\fIimage-filename\fR] [--launchable] [--maxdepth=\fIdepth\fR] [--maxheight=\fIpixel-height\fR] [--maxwidth=\fIpixel-width\fR] [--no-backup] [--noimages] [--not-beamable] [--not-launchable] [--no-urlinfo] [--owner-id=\fIname\fR] [--pluckerdir=\fIoutput-directory\fR] [--pluckerhome=\fIplucker-home-directory\fR] [--quiet] [--referrer=\fIstring\fR] [--status-file=\fIfilename\fR] [--staybelow=\fIurl-prefix\fR] [--stayonhost] [--title=\fIstring\fR] [--update-cache] [--url-pattern=\fIpattern\fR] [--user-agent=\fIstring\fR] [--verbosity=\fIverbosity-level\fR] [--zlib-compression] [HOME-URL] .SH DESCRIPTION .B plucker-build creates a Plucker binary document, which is a kind of e-book, from a URL. This document is formatted for the Plucker viewer program, which currently runs on Palm devices. The normal mode of operation is to take a \fIhome URL\fR and 'pluck' it to produce a Plucker document, either to stdout, or to a file if \fI--doc-file\fR is specified. Alternatively, specifying the option \fI--update-cache\fR will update a cache of Plucker records (though it's not clear what this is good for). The Plucker document format is specified at \fChttp://www.plkr.org/index.pl/cvs/docs/DBFormat.html?rev=HEAD\fR. .SH OPTIONS Many options are also available as parameters in the configuration file \fC$HOME/.pluckerrc\fR, or in the default configuration file. Where applicable, the name of the configuration file parameter is shown after the documentation on the option. An option given on the command line will override any configuration file parameter. For more on configuration files, see below. .TP \fB--alt-maxheight=\fIpixel-height\fR Specifies the maximum height, in pixels, of the \fIalternate rendition\fR of an image. (When inline images are too large to be included full-size, they are converted into smaller versions, with sizes governed by the MAXHEIGHT and MAXWIDTH parameters, and are linked to larger renditions of the images, called the \fIalternate rendition\fR.) [\fCalt_maxheight\fR] .TP \fB--alt-maxwidth=\fIpixel-width\fR Specifies the maximum width, in pixels, of the \fIalternate rendition\fR of an image. (When inline images are too large to be included full-size, they are converted into smaller versions, with sizes governed by the MAXHEIGHT and MAXWIDTH parameters, and are linked to larger renditions of the images, called the \fIalternate rendition\fR.) [\fCalt_maxwidth\fR] .TP \fB--author=\fIstring\fR Sets the author of the document to \fIstring\fR, which is assumed to be in the charset of the document (see \fB--charset\fR), or ASCII if no charset is specified. [\fCauthor_md\fR] .TP \fB--backup\fR Sets the bit in the output file that causes the document to be backed up on Palm HotSync. By default, the document is backed up. [\fCbackup_bit\fR] .TP \fB--beamable\fR Sets the bit in the output file that allows the document to be beamed. By default, the document is beamable. [\fCcopyprevention_bit\fR] .TP \fB--bpp=\fIimage-depth\fR Specifies the number of bits-per-pixel to be used for images. Valid values as of Plucker 1.1 are 0, 1 (the default), 2, 4, or 8. If 0 is specified, no images will be included in the document. See also \fB--noimages\fR. [\fCbpp\fR] .TP \fB--category=\fIdefault-category-name\fR Specifies a default Plucker category or categories to include in the document. If more than one category is specified, the category names should be separated by semicolons. [\fCcategory\fR] .TP \fB--charset=\fIcharset-indicator\fR Specifies the default character set encoding used in the text of the documents being plucked. \fIcharset-indicator\fR is either a charset name (from a small list; see \fCsrc/parser/python/PyPlucker/__init__.py.in\fR for a list of valid names), or a decimal integer indicating the charset's MIBenum value, as shown in the table at \fChttp://www.iana.org/assignments/character-sets\fR. [\fCdefault_charset\fR] .TP \fB--compression=\fIcompression-type\fR Specifies the type of compression to use in the document. There are two possible values for \fIcompression-type\fR: \fCdoc\fR or \fCzlib\fR. The default is \fCdoc\fR, which is the same compression system used in Palm DOC-format documents. \fCzlib\fR compression usually results in smaller documents. See also \fB--zlib-compression\fR and \fB--doc-compression\fR. [\fCcompression\fR] .TP \fB--depth-first\fR Specifies a depth-first traversal of the web graph, rather than the default breadth-first traversal. This often works better on bushy acyclic graph structures than the breadth-first traversal. [\fCdepth_first\fR] .TP \fB--doc-file=\fIname-prefix\fR (or \fB-f \fIname-prefix\fR) also as \fB-f \fIname-prefix\fR. Specifies the name of the document output file, without the directory (specified with --pluckerdir) or extension (always .pdb). If not specified, and if stdout is not a tty, the document will be written to stdout. [\fCdoc_file\fR] .TP \fB--doc-name=\fIdocument-name\fR (or \fB-N \fIdocument-name\fR) Specifies the short name by which the document will be identified in the viewer. Defaults to value of \fI--doc-file\fR. If \fI--doc-file\fR is not specified, the document name defaults to the home URL. This name should be limited to 26 characters. [\fCdoc_name\fR] .TP \fB--doc-compression\fR Specifies that Doc compression, the compression scheme developed for the Palm DOC format, should be used for the parts of this document. This is the default. See also \fB--zlib-compression\fR and \fB--compression\fR. .TP \fB--exclusion-list=\fIfilename\fR (or \fB-E \fIfilename\fR) Used to add additional files to the the \fIexclusion list\fR, a list of files containing information on URLs to exclude from the document. See the User's Guide for more information on exclusion lists. [\fCexclusion_lists\fR] .TP \fB--extra-section=\fIsection-name\fR (or \fB-s \fIsection-name\fR) Used to add additional sections to the list to searched sections in the configuration files. A section is a named set of configuration information. By default, the \fBDEFAULT\fR section will be searched, then any operating-system-specific sections, then any sections specified on the command line. .TP \fB--help\fR (or \fB-h\fR) Outputs help on command-line parameters. .TP \fB--home-url=\fIbase-url\fR (or \fB-H \fIbase-URL\fR) Specifies the URL from which the document is to be constructed. This may also be specified as a single argument on the command line. If a home URL is not specified, it will default to file:/$HOME/.plucker/home.html. This default may be changed in your .pluckerrc file. Note that this value must be a valid absolute URL. A special URL scheme is supported, \fBplucker:\fR. This specifies files on the Plucker search path, which consists of \fIPluckerDir\fR (the Plucker current working directory) followed by \fIPluckerHome\fR (the Plucker home directory). [\fChome_url\fR] .TP \fB--icon=\fIimage-filename\fR If the output file is launchable, this switch can be used to specify the large icon shown in the launcher for the document. If not specified, a default icon is used. If the output file is not launchable, this switch has no effect. See also \fB--launchable\fR. [\fCbig_icon\fR] .TP \fB--launchable\fR Specifies that the output document should be shown as an icon in the system launcher. Clicking on the icon will start Plucker and select this document. By default, documents are not launchable. [\fClaunchable_bit\fR] .TP \fB--maxdepth=\fIdepth\fR (or \fB-M \fIdepth\fR) This specifies the number of levels of links the parser will traverse when converting the input. It is best to keep this value small, or the size of your document can get very large. If you want just a page, but none of the pages pointed to by that page, use a value of 1. [\fChome_maxdepth\fR] .TP \fB--maxheight=\fIpixel-height\fR Specifies the maximum height, in pixels, for an inline image. Overrides the MAXHEIGHT parameter in the configuration file, but is in turn overridden by any height specification in the image link itself. [\fCmaxheight\fR] .TP \fB--maxwidth=\fIpixel-width\fR Specifies the maximum width, in pixels, for an inline image. Overrides the MAXWIDTH parameter in the configuration file, but is in turn overridden by any width specification in the image link itself. [\fCmaxwidth\fR] .TP \fB--no-backup\fR Clears the bit in the output file that causes the document to be backed up on Palm HotSync. By default, the document is backed up. [\fCbackup_bit\fR] .TP \fB--noimages\fR Specifies that no images will be included. Identical to --bpp=0. See also \fB--bpp\fR. .TP \fB--not-beamable\fR Sets the bit in the output file that prevents the document from being beamed. By default, the document is beamable. [\fCcopyprevention_bit\fR] .TP \fB--not-launchable\fR Specifies that the output document should not be shown as an icon in the system launcher. By default, documents are not launchable. [\fClaunchable_bit\fR] .TP \fB--no-urlinfo\fR Specifies that no URL information will be included in the document. When links are included in documents, the information about the actual URL is included by default. This is often handy for external references (links to documents not included in the document). Use of this option may result in a slightly smaller document. [\fCno_urlinfo\fR] .TP \fB--owner-id=\fIname\fR Specifies an owner-id for the document. This causes the document to be lightly encrypted in such a way that it will only open on a device with a matching owner-id. With the PalmOS viewer, the HotSync UserName is used as the owner-id. [\fCowner_id_build\fR] .TP \fB--pluckerhome=\fIplucker-home-directory\fR (or \fB-P \fIplucker-home-directory\fR) Overrides the default value for \fIPluckerHome\fR, which is $HOME/.plucker/. Can also be specified by setting the environment variable PLUCKERHOME. An explicit value for \fB--pluckerhome\fR overrides any setting of PLUCKERHOME. [\fCPLUCKERHOME\fR] .TP \fB--pluckerdir=\fIoutput-directory\fR (or \fB-p \fIoutput-directory\fR) Overrides the default value for \fIPluckerDir\fR, which defaults to \fIPluckerHome\fR (see \fB--pluckerhome\fR). \fIPluckerDir\fR is the default directory to which output documents will be written, and which will be searched for input files if the \fBplucker:\fR URL scheme is used. [\fCpluckerdir\fR] .TP \fB--quiet\fR (or \fB-q\fR) Same as --verbosity=0. .TP \fB--referrer=\fIstring\fR When using HTTP to gather input, send \fIstring\fR as the value of the Referrer HTTP header. Default is to send no referrer header. [\fCreferrer\fR] .TP \fB--status-file=\fIfilename\fR Gives the name of a file to read to get an estimate for the total number of pages that have to be processed, and to continually write with a single line giving the number of pages collected so far, the number of links still to process, and the estimated number of total pages that will be gathered (or zero if this is not known). The three values are written as space-separated ASCII numbers. The status line in the file is continually over-written as the pluck progresses, so the file will always contain only a single line. [\fCstatus_file\fR] .TP \fB--staybelow=\fIurl-prefix\fR Automatically excludes all URLs that do not start with \fIurl-prefix\fR. A handy way to process a subtree. [\fChome_staybelow\fR] .TP \fB--stayondomain\fR Specifies that no web hosts other than those in the same domain as the original base URL will be visited for parts of the document. [\fChome_stayondomain\fR] .TP \fB--stayonhost\fR Specifies that no web hosts other than that named in the original base URL will be visited for parts of the document. [\fChome_stayonhost\fR] .TP \fB--title=\fIstring\fR Sets the title of the document to \fIstring\fR. This is different from the name of the document (see \fB--doc-name=\fR) in that it may be relatively long. The \fIstring\fR is assumed to be in the charset of the document (see \fB--charset\fR), or ASCII if no charset is specified. [\fCtitle_md\fR] .TP \fB--update-cache\fR (or \fB-c\fR) Update the Plucker cache of records, rather than build a document. [\fCuse_cache\fR] .TP \fB--url-pattern=\fIpattern\fR Automatically excludes all URLs that do not match the regular expression \fIpattern\fR. The regular expression language used is that of the Python 're' module, as specified in \fChttp://www.python.org/doc/current/lib/re-syntax.html\fR. [\fChome_url_pattern\fR] .TP \fB--user-agent=\fIstring\fR When using HTTP to gather input, send \fIstring\fR as the value of the User-Agent HTTP header. Default is to send "Plucker/Py-\fIXX\fR", where \fIXX\fR is the Plucker version. [\fCuser_agent\fR] .TP \fB--verbosity=\fIverbosity-level\fR (or \fB-V \fIverbosity-level\fR) Sets the level of status information output to the value specified by \fIverbosity-level\fR. Appropriate values are 0, for total silence, 1, for standard progress status (the default value), and 2, for lots of output about gathering and parsing the input (usually reserved for debugging). Values larger than 2 will also work, but tend to give profuse output that's only useful to developers. See also \fB--quiet\fR. [\fCverbosity\fR] .TP \fB--zlib-compression\fR Specifies that Zlib compression should be used for the parts of this document. This is considerably more efficient than the default compression format, Doc compression. See also \fB--doc-compression\fR and \fB--compression\fR. .SH EXAMPLES To build a pocket version of the weekly cafeteria menu at the foo.com cafeteria, available on the Web at http://www.foo.com/ops/cafe/weeklymenu.html, without following any links, and without including any images, and naming the document "Cafeteria Menu", and putting the document in a file named /tmp/Menu.pdb, one would say: .sp \fC% plucker-build http://www.foo.com/cafe/weeklymenu.html >/tmp/Menu.pdb\fR .sp Or alternatively, .sp \fC% plucker-build --pluckerdir=/tmp \\ .br --doc-name="Cafeteria Menu" \\ .br --doc-file=Menu \\ .br --home-url="http://www.foo.com/cafe/weeklymenu.html" \\ .br --maxdepth=1 \\ .br --bpp=0 .br Pluckerdir is '/tmp'... .br ---- 0 collected, 1 to do ---- .br Processing http://www.foo.com/cafe/weeklymenu.html... .br Retrieved ok. .br Parsed ok. .br ---- all pages retrieved and parsed ---- .sp Writing out collected data... .br Writing document 'Cafeteria Menu' to file /tmp/Menu.pdb .br Converting http://www.foo.com/cafe/weeklymenu.html... .br Wrote 1 <= plucker:/~special~/index .br Wrote 2 <= http://www.foo.com/cafe/weeklymenu.html .br Wrote 3 <= plucker:/~special~/pluckerlinks .br Wrote 5 <= plucker:/~special~/metadata .br Wrote 11 <= plucker:/~special~/links1 .br Done! .br % ls -l /tmp/Menu.pdb .br -rw-rw-r-- 1 user somegroup 2646 Nov 2 21:19 /tmp/Menu.pdb .br % \fR .sp .SH "ENVIRONMENT VARIABLES" .TP HOME Used to determine the location of the user's configuration file. If not set, the system-wide configuration file is used. .TP HTTP_PROXY, HTTP_PROXY_USER, HTTP_PROXY_PASS If set, will be used to retrieve URLs with the \fChttp\fR URL scheme. .TP PLUCKERHOME Specifies value for \fIPluckerHome\fR. See the option \fI--pluckerhome\fR for more details. .TP PLUCKERDIR Specifies value for \fIPluckerDir\fR. See the option \fI--pluckerdir\fR for more details. .SH "CONFIGURATION FILES" Two configuration files are examined for customized settings of the various \fIplucker-build\fR parameters. The first is a system-wide configuration file, by default \fC/usr/local/etc/pluckerrc\fR. Any settings in this may be overridden with a personal configuration file, \fC$HOME/.pluckerrc\fR. Both files contain any number of \fIsections\fR, each of which may contain any number of configuration parameter settings. Each section has a name, which is enclosed in square brackets, followed by parameter settings. Normally, only the section called "default" will be examined. Extra sections may be specified with the \fI--extra-section\fR option to plucker-build; settings in these sections will override values in the default section. .PP Parameter settings have the form form \fIname = value\fR, where name is the name of a plucker-build parameter, and value is a string, integer, floating-point, or boolean value. A colon character (:) may be used instead of the equals sign to separate name and value. Comments may be expressed by starting any line with the characters "rem", or with the character "#", or with the character ";". Boolean values of True may be expressed with "TRUE", "true", "True", "on", or "1". Boolean values of False may be expressed with "FALSE", "false", "False", "off", or "0". .PP Configuration sections are often useful for specific often-used groups of options. It's possible to define these options in a section of the configuration file, and then just specify the section as the argument to \fCplucker-build\fR; the other options can all be drawn from the section. .PP The following parameters are understood: .TP \fBPLUCKERHOME\fR See option \fI--pluckerhome\fR. .TP \fBalt_maxheight\fR See option \fI--alt-maxheight\fR. .TP \fBalt_maxwidth\fR See option \fI--alt-maxwidth\fR. .TP \fBanchor_color\fR A color to draw all links in, expressed as one of the 16 standard Web color names, or in the Web standard RGB color notation. See the HTTP 4.0.1 specification for more details on allowed color names and RGB notation. .TP \fBauthor_md\fR See option \fI--author\fR. .TP \fBauto_scale_images\fR A boolean; if true, \fCplucker-build\fR will automatically attempt to convert images which are too large to include in the document, to a smaller form which will fit in the document. Defaults to false. .TP \fBbackup_bit\fR See option \fI--backup\fR. .TP \fBbig_icon\fR See option \fI--icon\fR. .TP \fBbmp_to_tbmp\fR Name of the bmp2tbmp program in Windows. Defaults to \fCBmp2Tbmp.exe\fR. .TP \fBbmp_to_tbmp_parameter\fR Parameter for the bmp2tbmp program in the Windows ImageMagick image parser. .TP \fBbpp\fR See option \fI--bpp\fR. .TP \fBcache_dir_name\fR Specify the subdirectory of \fIPluckerDir\fR to use for cache storage. The default is \fC"cache"\fR. .TP \fBcategory\fR See option \fI--category\fR. .TP \fBcolor_paragraphs\fR Boolean; if set, will insert a specific foreground color at beginning of every paragraph. Shouldn't be necessary, and defaults to off. .TP \fBcompression\fR See option \fI--compression\fR. .TP \fBconvert_program\fR If using the deprecated imagemagick image parser, the name of the \fCconvert\fR program. Defaults to \fCconvert\fR (\fCconvert.exe\fR for Windows). .TP \fBconvert_program_parameter\fR Parameter for the Windows ImageMagick image parser's use of \fCconvert\fR. .TP \fBcopyprevention_bit\fR See option \fI--beamable\fR. .TP \fBdb_file\fR Deprecated alternative to \fIdoc_file\fR. May disappear in any release. .TP \fBdb_name\fR Deprecated alternative to \fIdoc_name\fR. May disappear in any release. .TP \fBdefault_charset\fR See option \fI--charset\fR. .TP \fBdepth_first\fR See option \fI--depth-first\fR. .TP \fBdjpeg_program\fR Name of the \fCdjpeg\fR program. Defaults to \fCdjpeg\fR. Used by the netpbm2 image parser. .TP \fBdoc_file\fR See option \fI--doc-file\fR. .TP \fBdoc_name\fR See option \fI--doc-name\fR. .TP \fBexclusion_lists\fR See option \fI--exclusion-list\fR. If multiple files are specified here, they should be separated by the appropriate separator character for your operating system (a colon on Unix platforms, a semicolon on Windows platforms). .TP \fBfilename_extension\fR Extension to use for the filename. Defaults to \fCpdb\fR. Another possibility is \fCplkr\fR. .TP \fBgiftopnm_program\fR Name of program used to convert GIF image files to PNM image files. Used by the netpbm and netpbm2 image parsers. Defaults to \fCgiftopnm\fR. .TP \fBguess_tbmp_size\fR Boolean, defaults to on. Used by the Windows image parser. .TP \fBhome_maxdepth\fR See option \fI--maxdepth\fR. .TP \fBhome_staybelow\fR See option \fI--staybelow\fR. .TP \fBhome_stayondomain\fR See option \fI--stayondomain\fR. .TP \fBhome_stayonhost\fR See option \fI--stayonhost\fR. .TP \fBhome_url\fR See option \fI--home-url\fR. .TP \fBhome_url_pattern\fR See option \fI--url-pattern\fR. .TP \fBhttp_proxy\fR String giving any HTTP proxy server to use. Sets the environment variable HTTP_PROXY to this value. .TP \fBhttp_proxy_pass\fR String giving a password for any HTTP proxy. Sets the environment variable HTTP_PROXY_PASS to this value. .TP \fBhttp_proxy_user\fR String giving a username for any HTTP proxy. Sets the environment variable HTTP_PROXY_USER to this value. .TP \fBimage_compression_limit\fR Integer giving the minimum number of image bytes to compress. Defaults to 0. Images smaller than this will not be compressed. .TP \fBimage_parser\fR String specifying which image parser to use. If not specified, a working default will be used. It's suggested that you not specify this configuration parameter unless you know what you are doing. Acceptable values are \fCnetpbm2\fR, \fCpil2\fR, \fCimagemagick2\fR, \fCnetpbm\fR (deprecated), \fCpil\fR (deprecated), \fCimagemagick\fR (deprecated), \fCwindowspil\fR, \fCwindows\fR (deprecated). This value is ignored in the Java version of \fCplucker-build\fR. .TP \fBimagemagick_convert_command\fR Identifies the ImageMagick \fCconvert\fR program in the imagemagick2 image parser. Defaults to \fCconvert\fR. .TP \fBindent_paragraphs\fR Boolean which when set will cause paragraphs to have leading indentation, but no extra leading space. Defaults to off. .TP \fBlaunchable_bit\fR See option \fI--launchable\fR. .TP \fBmax_tbmp_size\fR Integer, maximum size for an image in the windows image parser. .TP \fBmaxheight\fR See option \fI--maxheight\fR. .TP \fBmaxwidth\fR See option \fI--maxwidth\fR. .TP \fBno_dithering_in_java_image_quantization\fR Boolean, used in the Java \fCplucker-build\fR image parser to turn off dithering when an image is being quantized to the fixed set of colors used in Palm grayscale or eight-bit colormaps. Defaults to false. .TP \fBno_urlinfo\fR See option \fI--no-urlinfo\fR. .TP \fBowner_id_build\fR See option \fI--owner-id\fR. .TP \fBpalm1bit_graymap_file\fR String, used by the netpbm2 and netpbm image parsers to get the location of the Palm colormap file. .TP \fBpalm2bit_graymap_file\fR String, used by the netpbm2 and netpbm image parsers to get the location of the Palm colormap file. .TP \fBpalm4bit_graymap_file\fR String, used by the netpbm2 and netpbm image parsers to get the location of the Palm colormap file. .TP \fBpalm8bit_stdcolormap_file\fR String, used by the netpbm2 and netpbm image parsers to get the location of the Palm colormap file. .TP \fBpalmtopnm_program\fR String, used by the netpbm2 image parser, giving the location of the palmtopnm program. Defaults to \fCpalmtopnm\fR. .TP \fBpgmtopbm_program\fR String, used by the netpbm2 image parser, giving the location of the pgmtopbm program. Defaults to \fCpgmtopbm\fR. .TP \fBpluckerdir\fR See option \fI--pluckerdir\fR. .TP \fBpngtopnm_program\fR String, used by the netpbm2 image parser, giving the location of the pngtopnm program. Defaults to \fCpngtopnm\fR. .TP \fBpnmcut_program\fR String, used by the netpbm2 image parser, giving the location of the pnmcut program. Defaults to \fCpnmcut\fR. .TP \fBpnmdepth_program\fR String, used by the netpbm2 image parser, giving the location of the pnmdepth program. Defaults to \fCpnmdepth\fR. .TP \fBpnmfile_program\fR String, used by the netpbm2 image parser, giving the location of the pnmfile program. Defaults to \fCpnmfile\fR. .TP \fBpnmscale_program\fR String, used by the netpbm2 image parser, giving the location of the pnmscale program. Defaults to \fCpnmscale\fR. .TP \fBppmquant_program\fR String, used by the netpbm2 image parser, giving the location of the pnmquant program. Defaults to \fCpnmquant\fR. .TP \fBppmtoTbmp_program\fR String, used by various image parsers, giving the location of either the ppmtoTbmp program (in various deprecated image parsers), or in netpbm2, the pnmtopalm program. In netpbm2, defaults to \fCpnmtopalm\fR. .TP \fBppmtopgm_program\fR String, used by the netpbm2 image parser, giving the location of the ppmtopgm program. Defaults to \fCppmtopgm\fR. .TP \fBreferrer\fR See option \fI--referrer\fR. .TP \fBretrieval_timeout\fR Integer, used to attempt to set a timeout in seconds on all retrievals. Will not affect timeouts on Java version of \fCplucker-build\fR. .TP \fBsmall_icon\fR Filename of file containing a Palm icon to use as the small icon for the document, if the launchable bit is set. Defaults to a built-in icon. .TP \fBstatus_file\fR See option \fI--status-file\fR. .TP \fBstatus_line_length\fR Integer, specifying, in characters, the length of status lines output by the distiller. Defaults to 60. If a line is too long, some of the characters in the center are elided. .TP \fBtbmp_compression\fR Boolean, used by the windows image parser to indicate whether or not to use Palm compression on images. Defaults to true. .TP \fBtbmp_compression_type\fR Apparently also boolean, used by the windows image parser to indicate whether or not to use Palm compression on images. Defaults to true. The difference between this parameter and \fItbmp_compression\fR is not known. .TP \fBtitle_md\fR See option \fI--title\fR. .TP \fBtry_reduce_bpp\fR Boolean, controls whether the image parser will attempt to scale a large picture to fit by reducing the number of bits-per-pixel of the image. Only valid for netpbm2, imagemagick2, pil2, java, and windows image parsers. Defaults to off. \fItry_reduce_bpp\fR has precedence over \fItry_reduce_dimension\fR or \fIauto_scale_image\fR. .TP \fBtry_reduce_dimension\fR Boolean, controls whether the image parser will attempt to scale a large picture to fit by reducing the size of the image. Only valid for netpbm2, imagemagick2, pil2, java, and windows parser. .TP \fBuse_cache\fR See option \fI--update-cache\fR. Misleadingly named. .TP \fBuser_agent\fR See option \fI--user-agent\fR. .TP \fBverbosity\fR See option \fI--verbosity\fR. .TP \fBzlib_compression\fR Specifies that zlib compression should be used. Deprecated in favor of \fIcompression\fR. .SH "SEE ALSO" \fBThe Plucker User's Guide\fR, at \fChttp://plkr.org/docs/\fR. .SH "BUGS" Report bugs to http://bugs.plkr.org/ or .SH "AUTHORS" Holger Duerer, , and Bill Janssen, plucker-1.8/docs/Plucker_Doc.tex0100644000076400001440000000537210027064212015710 0ustar mickeusers% Format: Latex Orientation: Portrait % % This Document was created using International Codepage 850! % To use this Document with \nfindex{Unix}-Style systems you've to convert all % german "Umlaute" to there TEX-Equivalent "a "o "u etc.! % % Created using emTeX for OS/2 % % $Id: Plucker_Doc.tex,v 1.9 2004/03/20 15:51:38 prussar Exp $ % \documentclass[draft]{report} % \documentclass[titlepage]{report} \usepackage{makeidx} \usepackage{html} \usepackage{epsf} %\usepackage{hyperref} %\usepackage[cp850]{inputenc} \makeindex % Seitengren definieren \textheight24cm \textwidth16.5cm \topmargin-1.5cm \oddsidemargin0cm \evensidemargin0cm \parindent0cm % special declarations for this doc: \newcommand{\viewerram}{98 kB} \newcommand{\libram}{30 kB} \newcommand{\ioption}[1]{{\textbf{#1}}\index{#1 option}} \newcommand{\iname}[1]{{\textit{#1}}\index{#1}} \newcommand{\icode}[1]{{\texttt{#1}}\index{#1}} \newcommand{\longoption}[2]{{\textbf{#2}}\index{#1! #2}} \newcommand{\longcode}[2]{{\texttt{#2}}\index{#1! #2}} \newcommand{\option}[1]{{\textbf{#1}}} \newcommand{\name}[1]{{\textit{#1}}} \newcommand{\code}[1]{{\texttt{#1}}} % Only the HTML version will give you a constant bold font \newcommand{\indata}[1]{{\textbf{\texttt{#1}}}} \newcommand{\devaddress}{\htmladdnormallink{plucker-team@rubberchicken.org}{mailto:plucker-team@rubberchicken.org}} \newcommand{\note}{\textbf{NOTE}: } \newcommand{\hint}{\textbf{Hint}: } \newcommand{\warning}{\large \textbf{WARNING}: } \title{Plucker for PalmOS} \author{Alexander Wagner} \date{23. July 1999} % Seitengren definieren \begin{document} \begin{center} \vspace*{4cm} \begin{figure} [h] \centerline{\epsffile{chicken-head.eps}} \end{figure} {\Huge \bf \it Plucker}\\ \vspace*{1cm} {\Large A free multiplatform tool for reading}\\ {\Large web pages on Palm OS\textsuperscript{\tiny \textregistered} handhelds}\\ \vspace*{2cm} {\Huge User's Guide} \vspace*{8cm} \end{center} \pagebreak Copyright \copyright{} 2000 The Plucker Team \devaddress. All rights reserved.\\ This software is supplied free of charge under the terms of the GNU General Public License (see appendix for details).\\ The following are trademarks or registered trademarks of Palm Inc: Graffiti, Palm Computing, Palm, PalmPilot, Palm III, Palm V, Palm Vx, Palm OS\. All other product names used in this document are trademarks or registered trademarks of their respective owners. \pagebreak \tableofcontents %============== Dokument Begin ===================================== \include{Introduction} \include{Quickstart} \include{Viewer} \include{PPI} \include{Parser} \include{Advanced} \appendix \include{Links} \include{PluckerDB} \include{Credits} \include{GPL} %===============Dokument Ende ====================================== \printindex \end{document} plucker-1.8/docs/PluckerDB.tex0100644000076400001440000000065507354743606015354 0ustar mickeusers% % $Id: PluckerDB.tex,v 1.16 2001/09/28 00:42:46 janssen Exp $ % \begin{htmlonly} \chapter{The Plucker Format} \end{htmlonly} \begin{rawhtml} [Your user agent is not configured to support generic inclusion via the OBJECT tag. However, you may visit the description of the Plucker document format via this link.] \end{rawhtml} plucker-1.8/docs/Viewer.tex0100644000076400001440000005424510027320604014762 0ustar mickeusers% % $Id: Viewer.tex,v 1.17 2004/03/21 14:07:00 nordstrom Exp $ % \chapter{Viewer} Using Plucker's client application (in this chapter refered to as the \emph{viewer}) is in many ways just like using a normal web browser (except for the fact that you are not connected to the Internet). \section{Basic Operations} This section describes how to start the viewer and navigate between different pages. If you are new to Plucker, read this section to get used to its basic operations. Later sections will describe how to customize the viewer in many ways, handling of multiple documents, the find function, and how to add bookmarks. \subsection{Starting The Viewer} Tap on the Plucker icon in the Applications screen to start the viewer. The first time the viewer is started it will open the document library and display the available document in RAM and, if the device is equipped with external card(s), any documents on the card(s). Subsequent launches of the viewer will start where you left off. If ZLib compression has been used when creating the document (see \~ref{sec:ParserOutput}) then the ZLib shared library must be installed or the records in the document cannot be uncompressed. DOC compressed documents don't require any additional library. \subsection{The Main Screen} The viewer will render the pages as close to the original as possible, using everything from italic and bold fonts to embedded images. It also support horizontal rules, ordered and unordered lists, headers (using different font sizes), left, right, and center text alignment, and justified text. \begin{figure} [!htb] \centerline{\epsffile{MainScreen.eps}} \caption{\label{fig:MainScreen}The Main Screen.} \end{figure} The toolbar can be moved from the top to the bottom of the screen or removed completely using preference settings (see \~ref{sec:Prefs}). The viewer has a 32 page history, so you can easily move backward and forward through recent visited pages just as you would with your desktop browser.\\ There are several different ways to move within the current page and perform different actions. You can move using the scrollbar, the scroll buttons and if the tap action (see \~ref{sec:TapAction}), gesture action (see \~ref{sec:Gestures}), and button action (see \~ref{sec:HWButtons}) are activated also by pen taps on the screen, gestures in the graffiti area and by pressing the hardware buttons, respectively. The fastest way to move within the page is to use the location selector, though. Tap on the location (the percentage in the toolbar) and a dropdown menu will appear with 11 different values, Top, 10\%, 20\%,\ldots 90\%, and Bottom, so that you can choose the location you want to jump to. Tapping the autoscroll buttons will cause the text to scroll by at the specified rate (see \~ref{sec:Autoscroll}.\\ Just like a web browser the viewer underlines links, a solid line for not visited pages and a dotted line for already visited pages. Tap on an underlined link to open the page it refers to (the link will be highlighted when you tap on it). Image links are not underlined but it should be obvious when an embedded image is a link and when it is not. When in doubt just tap on the image, if it highlights it is an image link\ldots\\ Embedded images will be scaled down if they are too big to fit within the available width of the screen. If the alternative image options are activated (see \~ref{sec:Parser}), then the embedded images will be a link to a larger version of itself. Tap on the image and the larger version will be shown. The viewer will try to change the screen depth to the depth required by the Tbmp document and if that depth is not supported it will display an alert. To see all parts of the \emph{larger-than-screen} image, tap on it and drag the pen in all directions.\\ When you tap on an e-mail tag the viewer will open a form so that you can compose and send a message. The form will show as much as possible of the To: Cc: and Subj: lines. If they don't fit on one line a little arrow will appear next to the line to allow you to see the rest of the line. The message will be sent through the built-in Mail application (i.e.\ you have to enable the mail synchronization using the Hotsync options (Windows) or some external tool (other platforms) to send the mail).\\ \begin{figure} [!htb] \centerline{\epsffile{Mail.eps}} \caption{\label{fig:Mail}Mail form.} \end{figure} Some pages may have external references (i.e.\ links to pages that were not included because they were either filtered out using the \name{exclusionlist.txt} file, excluded by \code{STAYONHOST}/ \code{STAYBELOW} or was exceeding the maximum link depth).\\ \begin{figure} [!htb] \centerline{\hspace{1cm}\epsffile{CopyURL.eps}} \caption{\label{fig:CopyURL}Copy URL.} \end{figure} When such a link is followed the viewer will display a page with the URL for the external reference. You can tap \option{Copy URL} and the URL will be added to a Memo in the Memo database.\\ The Memo will be titled \code{Plucker URLs

Frequently Asked Questions about Plucker (Plucker FAQ) The Plucker Team
plucker-list@rubberchicken.org
0.01 2002-05-18 dd Converted to DocBook for easier maintenance 0.02 2002-09-06 dd Cleaned up some typos, match FAQ.sgml to website FAQ, new mailing list info 0.03 2003-01-07 am Added in entry about documents not showing up on external memory If your question is not there, please check the Plucker home page which may have more recent information. SGML source for this document is available and should be checked for the latest version.
Introduction This document is available in CVS as well as in the source for Plucker itself under the ./docs directory. You can reach it via the Plucker cvs tree. What is Plucker? Plucker is a suite of programs which provide an offline web browser for PalmOS handheld devices (see the section "Supported Platforms" for device compatibility). It's Free Software under the conditions of the Free Software Foundation's General Public License (GPL), so you can copy, change, or even sell this program without giving anyone any money, as long as you make the source code (and your changes, if any) publicly available to remain compliant with the GPL. We would, of course, be interested to see any changes you might make and possibly include them in a future release of Plucker. There's lots of things that could be added and improved! In many ways, the ideas of Plucker are similar to the proprietary AvantGo software, though we believe that the implementation of Plucker is much different than AvantGo. According to their web page, AvantGo implements an html parser on the Palm device; Plucker implements the majority of the parser on the PC/server/desktop machine. There are probably situations where AvantGo would be far more appropriate than Plucker (online browsing, for example). However, you need an SDK to work with AvantGo, and AvantGo is not free. In what way is Plucker different from AvantGo? The programs differ in many ways. Most importantly (to us, at least), Plucker is Free Software, distributed under the FSF's General Public License, or GPL. This means that if you are using Plucker, you are entitled to the source code, and you can change it to make it do whatever you want, as long as you make sure to adhere to the requirements of the GPL. Other differences that we know of include: AvantGo parses compressed (i.e. "encrypted") html on the Palm device itself; Plucker parses uncompressed html on the server, and sends an interpreted version to the Palm. Plucker appears to render documents faster (though it hasn't been optimized for speed, really) The "home" Plucker page is a user-defined html document, and is treated just like any other. The "home" AvantGo page does not appear to be html; it's determined by the AvantGo configuration software. So, the history buttons don't work from the Home page in AvantGo. Plucker will support drag-n-drop (DND) html files. As far as we know, AvantGo does not. Where can I get Plucker? Visit the Plucker home page at http://www.plkr.org/ The development versions ("the latest snapshot") are usually very stable themselves, so if you want access to all the latest features (and have the proper development environment installed and configured) you can safely go with these versions. As always, remember to backup any unsaved data before you start playing with the development version. Is there a mailing list for Plucker? Yes, there are three mailing lists in fact. Plucker List is for general Plucker user questions and is a fairly low traffic list, and covers most of the basic setup, configuration, and user questions people may have. To join the list or modify your subscription preferences, visit the plucker-list signup page. To view the archives of this mailing list, simply visit the plucker-list archives here or here and read any messages you wish. The Plucker Development list is intended for focused development discussion amongst the core Plucker development team and other contributors. Of course, anyone is welcome to read the list, but don't be surprised if we get deep into code quickly. To join the list or modify your subscription preferences, visit the plucker-dev signup page. To view the archives of this mailing list, simply visit the plucker-dev archives here or here and read any messages you wish. The Plucker Announce list is where new releases are announced. If you are only concerned with Plucker releases, this is the list for you. To join the list or modify your subscription preferences, visit the plucker-announce signup page. Is there an anonymous cvs server? Yes there is. To check out the code from cvs you first have to login using the normal cvs commands as follows:
$ export CVSROOT=':pserver:anonymous@cvs.plkr.org:/cvs/plucker' $ cvs -z3 login Logging in to :pserver:anonymous@cvs.plkr.org:2401/cvs/plucker CVS password:
There is no password for the anonymous user, just hit ENTER at the password prompt. Once you've logged in, you may check out the latest Plucker code with the following cvs command:
$ cvs -z3 co plucker
Each command must be typed on one line, even though the command may wrap in your browser window
What is the status of Plucker? Plucker is in a beta state. While you're more than welcome to take Plucker for a spin, it might not work for you. It works for us, but we don't know what you've got installed on your machines that may be different from that installed on ours. You might lose all the data on your Palm, you might need to reboot your machine, it might never be the same again. You have been warned. Where do I send bug reports?? There are two ways: Fill out the BUGREPORT form in the Plucker distribution and send it to plucker-bugs@rubberchicken.org (no, really, we're not kidding). Or, on the web, fill out the forms located here in our online bug tracking system and we'll do our best to fix them as soon as we can!
Supported Platforms What platforms does Plucker run on? The viewer should run on any PalmOS device running version 2.0.4 or higher of PalmOS, while the desktop tools are supported on Linux, Windows, Mac OS X, and OS/2. The desktop tools will probably work on any Unix system with Python installed, but your mileage may vary, so don't get angry if they don't work. If you are able to get it running on a system not listed in REQUIREMENTS then please let us know so that it can be added to the list of known working systems. Usage How does Plucker work? Plucker consists of three parts: the parser, the conduit, and the viewer. The parser and the conduit have been merged into one complete Python version and eventually there will also be a Perl version of the parser. The standalone conduit is written in Perl and there is also a conduit written in Delphi for the Windows users. The parser runs on your main computer (the one with the HotSync cradle or IR port physically attached to it, or on a networked machine which allows you to connect to it via Network Hotsync). It gathers the web pages you specify and follows the links on those pages to a chosen depth (specified by you). You specify the web pages you want to gather by creating a "home.html" file, which also becomes your home page. The links on "home.html" are followed to a depth specified by the optional "maxdepth" attribute which you can include in the <a href="..."> tag in the home.html file. The parser finds new links to retrieve and converts the pages to a format that the viewer can read. The conduit takes the converted html files from a directory or from your computer's system memory (RAM; using the python parser) and places them in a database on your Palm device, or directs them to a file (which is the same as the database) on your desktop, which you can sync to your emulator or your "real" Palm device at a later time. The viewer displays the converted html files on your Palm device's screen. It allows you to use the stylus to tap on links which will then display the target page. It has a 32-page history, so you can move backwards and forwards through the pages just as you would with your desktop browser. Rendering is done in part by the parser (which works out things like which styles to use) and in part by the viewer (which works out line and document lengths, and renders <A>nchor tags). Why aren't the documents on my external card(s) showing up in Plucker's Document Library? Plucker can read documents on stored on external card(s) provided that you meet the following criteria. You are using a version 1.2 or later of the viewer. The documents you are trying to view are stored in one of the following directories: /Palm/Programs/Plucker/ /Palm/Ebooks/ /Palm/Launcher Why can't I see any images on my Palm device? Either you have an old version of Plucker (image support was added in version 0.03) or you haven't installed all necessary tools. The Palm device uses a format called Tbmp (Tiny Bitmap) for its images, and the parser in Plucker needs (among others) a special tool called ppmtoTbmp to be able to convert images to the Palm OS bitmap format (depending on your version of Plucker, you may no longer need to use the ppmtoTbmp tool. It has recently been replaced by the netpbm2 package). Check out the REQUIREMENTS file in the main source archive for a list of necessary tools and where to find them. I have all the necessary tools, but I still can't see any images? Make sure that you don't set a too high value for the maxwidth configuration option. Anything above 150 pixels (default value) for embedded images will give the result that no images are shown. Why do pages with images show [img 4bpp] instead of images? When you generate 2 or 4 bpp images you have to change the bit depth of the screen to view them. The default depth is 1 (Black/White), so when the viewer finds images of a higher bit depth it will display [img Nbpp] instead (N = bit depth for the image). You change the bit depth in the Preference dialog. The protocol is missing when the parser attempts to download a page? Even if you don't tell us what OS you are running we would be very surprised if it's not Red Hat 7.0, 7.1, or 7.2. There is a bug in the python version (1.5.2) include with Red Hat 7.0, 7.1, and 7.2. A solution provided by Joe A. can be found at
http://home.earthlink.net/~joefefifo/plucker/fix.html
A more detailed discussion of the problem can be found at:
http://home.earthlink.net/~joefefifo/plucker/fix_detailed.html
How do I pluck a password-protected site? We suggest using Sitescooper together with Plucker to pluck various hard-to-get-at sites. Sitescooper has many features for pulling over pages that will be slow to appear in Plucker. For more information on Sitescooper, see http://www.sitescooper.org/. I'd like to use Plucker for (books, reports, etc.) which I sell. Is there any way to protect a Plucker document from theft? Plucker documents can be built with an 'owner-id', which must correspond to the HotSync ID on a Palm for the document to be opened on that Palm. This is similar to the document-locking schemes used by many commercial sites. Use the --owner-id switch on the parser to do this.
Configuration How do I configure the parser to create ZLib compressed databases? By setting the compression key in the configuration file (.pluckerrc for Unix/Linux, plucker.ini for Windows and OS/2) to zlib the parser will use ZLib instead of DOC compression for the databases. You can always change this behavior at run-time by using the --zlib-compression or the --doc-compression options. Development Why does make only build the viewer application but never the ZLib library? You didn't read the README in the viewer dir, did you? The zlib package must be downloaded separately and put in the ./viewer/ZLib directory that you see there, before attempting to configure Plucker. Where can I get zlib? You can download zlib from the zlib project home page at the following site:
http://www.gzip.org/zlib/
Put the package into the ./viewer/ZLib directory before you run configure.
Where can I get prc-tools? prc-tools 2.x can be downloaded at:
http://prc-tools.sourceforge.net/
Why is the <module X> so messy? Well, the old legacy parser (a bunch of awk scripts) was only a temporary solution and have been replaced with a Python-based parser. That should make it easier to comprehend what it actually does! We believe that the rendering of documents for the Palm device should be specialized, so we intend to continue to render the documents in the parser/viewer. If you haven't looked at the viewer since 0.02 then you would probably be surprised. The single source file of version 0.02 has been split up in several files and the viewer is approaching being optimal, but there are some issues, particularly with implied structure coupling, and lack of documentation, both of which we wish to address. The conduit is not clever. It will upload pages to the database even if they already exist and have not changed. This should obviously be fixed so that a full 360 degree synchronization process can be achieved.
Miscellaneous Questions Can you suggest some good web pages for Plucker? In the appendix of the User's Guide you'll find a collection of links to some good web pages for Plucker. What are some of the features of Plucker? Plucker has many, many features which make it very useful for a lot of different purposes and reading habits of a diverse set of users and platforms. Here are just a few: Plucker is designed for off-line browsing on a small screen. It doesn't attempt to make html pages look like they appear on a monitor; instead, it tries to make them readable and useful. The history buttons always work, even from the home page. You can scroll nicely with the scroll buttons or the pen. On-screen indication of visited links. Image support Named anchors (such as <a href="#here">) Very impressive compression of records to save space on the device. Support for multiple databases and multiple versions of the same content. Search function for current page and all pages in a database Bookmarks Possible to copy URLs to a memo E-mail support (through the use of mailto links) There are dozens more features not listed here, go ahead and give Plucker a go, and try them all out for yourself. What features does Plucker not implement? The following is a (non-exhaustive) list of unimplemented features. Apart from frames, we intend to include this functionality in the future: Frames (it might be possible to implement this in a links kind of way by rendering and converting the frames to tables, much like the links browser). Document titles are not currently uploaded to the Palm device. Various html tags (e.g. <font>, <sup>, etc) are not fully supported Javascript, DHTML, Java, CSS What other features can we expect? Here is a list of other ideas for Plucker. No promises! A TODO list sorted both by category and by date can be found on the Plucker developer's page. We intend to integrate Plucker with the popular free desktop environments (such as KDE and GNOME). In these environments it would be great if you could Drag-'n'-Drop a URL into the Palm device for off-line viewing. The ability to modify parameters, such as the maximum link depth, from the Palm device, so that the next HotSync will retrieve more/less data. The ability to "send" a web page from the Palm device to an internet mail address. Cron-based gathering of html pages, prior to a HotSync (to significantly reduce HotSync time). Parallel gathering/parsing/conduit (to reduce HotSync time). Smart gathering/conduit; only update a document if it's actually changed. (Reduce HotSync time). Compatibility with AvantGo's .subs files, and the .site files that a similar product Sitescooper reads. Of course, if you want to help add or improve these (or other) features, feel free to ask on the plucker-dev mailing list, or just implement them yourself. Where can I find Plucker eBooks? Apart from the samples you can find at the Plucker web site, there are other sites that have eBooks as well. Memoware has a growing collection of Plucker eBooks submitted by contributors and users of Plucker:
http://www.memoware.com/cgi-bin/mwsearch.cgi?Any=plucker
You can also find several Plucker eBooks at Byron Collins' site
http://home.clarksville.com/~bcollins/PalmDocs.htm
Curt 'n' Dave's Plucker-book Repository
http://www.pluckerbooks.com/
Nick Vargish's Bandersnatch Unpress
http://unpress.bandersnatch.org/
The "Linux Documentation Project" (LDP) now releases all its HOWTOs and mini-HOWTOs in Plucker format. They are located under the 'Additional HOWTO-related items at the following url:
http://www.linuxdoc.org/docs.html#howto
or
http://ibiblio.org/pub/Linux/docs/LDP/pluckerdb
plucker-1.8/docs/PPI.tex0100644000076400001440000000246310027320604014144 0ustar mickeusers% % $Id: PPI.tex,v 1.4 2004/03/21 14:07:00 nordstrom Exp $ % \chapter{Plucker Plugin Interface}\label{sec:PPI} The Plucker Plugin Interface (PPI) is a separate program (e.g., \code{ppi\_en.prc}) used to interface Plucker with external programs like dictionaries. To use PPI to look up words, configure the Viewer as described in \~ref{sec:Lookup}.\\ PPI has hard-coded settings for the popular dictionary programs RoadLingua, KDic DA, and BDicty. To use with other dictionaries or encyclopedias, ask their customer support for appropriate data to enter into the \option{Custom} setting.\\ The RoadLingua dictionary viewer is commercial, but the developer has made the free (as in beer) unregistered version act like the registered version (at least with non-commercial dictionary texts) when it is invoked via PPI. You may need the latest version of RoadLingua for this from \textit{\htmladdnormallink{http://www.absoluteword.com} {http://www.absoluteword.com}}.\\ Note that when using the free version of BDicty, the word will be put into the clipboard and will need to be pasted into BDicty.\\ PPI is available for use with other programs than Plucker. For instance, currently PalmBible+ uses it for its dictionary lookup; see: \textit{\htmladdnormallink{http://palmbibleplus.sf.net} {http://palmbibleplus.sf.net}}. plucker-1.8/docs/DBFormat.html0100644000076400001440000012404710033732652015330 0ustar mickeusers The Plucker Document Format

The Plucker Document Format

Introduction

This document is the official description of the Plucker format.


Overview

The Plucker document format supports a multi-page (in the Web sense of 'page') hyperlinked information structure containing both 'rich' text and images. Links must be internal to the document, though external links, in standard URL form, may be included and displayed, but not followed. Images may either be embedded in a text page, as with HTML, or be included as separate stand-alone pages.

Plucker documents are structured so that they can be used both with a file-system-oriented operating system such as Unix or Windows, and with the PalmOS, a non-file-system-oriented OS. To this end, they always begin with a standard PalmOS record database prefix, which consists of four parts: the database header, a record-id list, an AppInfo block, and a SortInfo block. The Plucker format does not use the SortInfo block, which is therefore null, and consequently occupies no space in the document prefix.

The record database prefix is then followed by a sequence of application-specific records. In a Plucker document, this sequence consists of one index record, followed by a series of data records. The index record contains information about the data records, along with some global information, such as the type of compression used. Each data record contains either a page, an image, or data about the document, such as bookmarks or URL data.

The format is big-endian; any multi-byte numeric values specified in this document are big-endian. Images are stored in the Palm image format; for more information on this format please consult http://www.palmos.com/dev/tech/docs/.


The Database Prefix

The Database Header

The database header is a fixed-size structure of 72 bytes. It contains the name of the database, the Plucker version number, various timestamps (creation, modification, last backup), and several flags. All timestamps are given using the PalmOS standard, seconds since 12:00 AM on January 1, 1904.

Field Bytes Type Notes
docName 32 String Must contain a NUL-terminated 7-bit ASCII string (only character codes 0x20-0x7E are valid) giving the name of the document. Because of the terminating NUL character at end, only 31 bytes can actually be used for the name of the document. The first 26 bytes of this string are used by Plucker as a unique ID for the document; names should be unique in the first 26 characters.
flags 2 Bitfield Most bits in this field are unused. Unused bits should be set to zero on document creation, but reader software should not expect them to stay at this value.

Valid bits are as follows. All numeric values given are big-endian.

Name Value Meaning
CopyPrevention 0x0040 Indicates that system should not allow copying of this document.
Launchable 0x0200 Indicates that this document should be presented as a first-class object on desktop renderings. If this bit is set, an AppInfo block must be included.
Backup 0x0008 Indicates that this document should be backed up, if the system includes such a capability.
version 2 Numeric Version of the Plucker format used in this document. Must have the value 1.
creationDate 4 Timestamp Time of document creation
modificationDate 4 Timestamp Time document last modified
unused1 8 Numeric Must be zero at document creation, but any specific value should not be relied upon.
appInfoOffset 4 Numeric Either zero, if no appInfo is present, or the offset from the beginning of the document to the start of the appInfo block.
sortInfoId 4 Numeric Must be zero.
magic 8 String Must be the 8 ISO Latin-1 characters "DataPlkr". No terminating NUL character.
unused2 4 Numeric Must be zero at document creation, but any specific value should not be relied upon.

The Record-ID List

This list consists of a six-byte list header, followed by one ID entry for each data record in the document. The list header has the structure:

Field Bytes Type Notes
nextRecordListID 4 Numeric Must be zero.
numRecords 2 Numeric Number of records in the document, including the index record.

This is then followed by numRecords entries of the following structure:

Field Bytes Type Notes
recordOffset 4 Numeric Number of bytes from the start of the document to the beginning of the record
attributes 1 Bitfield Record attributes -- should be zero.
uniqueID 3 Numeric A local (document-specific) unique ID for the record. This is not used by Plucker (because it is not preserved by PalmOS through beaming of a document), but must still be different for each record.

Finally, there are two bytes of zero-padding to bring the structure alignment back to 4 bytes.

The AppInfo Block

Typically, this is only present when the launchable flag is set in the flags field of the database header. No Plucker data aside from icon display information and a versioning string is stored in this block. This block has the following structure:

Field Bytes Type Notes
signature 4 Numeric Must contain the value 0x6C6E6368.
hdrVersion 2 Numeric Must have the value 3.
hdrEncoding 2 Numeric Must have the value 0.
verStrWords 2 Numeric The number of two-byte words following, containing the version string.
verStr 2 * verStrWords String NUL-terminated ISO Latin-1 string, padded at end if necessary with a zero byte to an even-byte boundary, containing a version string to display to the user containing version information for the document.
pqaTitleWords 2 Numeric The number of two-byte words in the following pqaTitleStr.
pqaTitleStr 2 * pqaTitleWords String NUL-terminated ISO Latin-1 string, padded at end if necessary with a zero byte to an even-byte boundary, containing a title string for iconic display of the document.
iconWords 2 Numeric Number of two-byte words in the following icon image.
icon 2 * iconWords Image Image (32x32) in Palm image format to be used as an icon to represent the document on a desktop-style display. The image may not use a custom color map.
smIconWords 2 Numeric Number of two-byte words in the following icon image.
smIcon 2 * smIconWords Image Small image (15x9) in Palm image format to be used as an icon to represent the document on a desktop-style display. The image may not use a custom color map.

The Index Record

This record includes info about the compression type used for the Plucker document and also what IDs the reserved records use. The viewer will use this record to know where to look for the reserved records and whether it must have support for ZLib compression. This record should always be the first record in the Plucker document (i.e. at index 0).

Field Bytes Type Notes
uid 2 Numeric unique ID for record, always 0x0001
version 2 Numeric 0x0002 if data is ZLib compressed, 0x0001 if DOC compressed
records 2 Numeric number of reserved records
reserved 4*records Numeric reserved ID array

The reserved ID array consists of a series of name/ID pairs, where the ID is the unique ID (2 bytes) for the record and the name is a value (2 bytes) from the following list.

  • home.html = 0
  • external bookmarks = 1
  • URL handling = 2
  • default category = 3
  • additional metadata = 4

The Data Records

There are several different types of data records.

Each data record starts with a header, having the following structure:

Field Bytes Type Notes
uid 2 Numeric Unique ID for record. IDs must be sorted in increasing order. Currently the ID is not allowed to be 0xFFFF. Moreover, some earlier versions of the viewer had a bug that crashed on records numbered 0x8000-0xFFFE.
paragraphs 2 Numeric number of paragraphs
size 2 Numeric total length of data before compression
type 1 Numeric Data type. Must be one of the following:
Data type Value
DATATYPE_PHTML 0
DATATYPE_PHTML_COMPRESSED 1
DATATYPE_TBMP 2
DATATYPE_TBMP_COMPRESSED 3
DATATYPE_MAILTO 4
DATATYPE_LINK_INDEX 5
DATATYPE_LINKS 6
DATATYPE_LINKS_COMPRESSED 7
DATATYPE_BOOKMARKS 8
DATATYPE_CATEGORY 9
DATATYPE_METADATA 10
DATATYPE_STYLE_SHEET 11
DATATYPE_FONT_PAGE 12
DATATYPE_TABLE 13
DATATYPE_TABLE_COMPRESSED 14
flags 1 Numeric Bit-mapped record flags. Currently only bit zero is used: a value of one indicates that the record is continued by the fragment in the next sequential DATATYPE_PHTML or DATATYPE_PHTML_COMPRESSED record, and a zero indicates that the record is not to be continued (i.e., there are no fragments beyond this one, or this is the last one). Other bits should be set to zero.

Compression and the Owner-ID

This data format supports two forms of compression, DOC and ZLIB. That part of a data record that occurs after the header is compressed as a single chunk. All compressed records in a single document must use the same compression format. Compressed records may be mixed with uncompressed records. In a compressed record, the length of the compressed data must be less than its uncompressed length.

DOC compression is the the format invented for early Palm usage.

ZLIB compression uses the ZLib format documented in Internet RFCs 1950 and 1951. See also http://www.gzip.org/zlib/manual.html for a description of the library used to perform the compression and decompression.

Plucker documents may be keyed to a specific string of 40 or fewer ASCII characters, called the owner-id. When such a key is specified, zlib compression must be used in the document. When an owner-id is specified, the beginning of each zlib-compressed data segment is XOR'ed with a value derived from the key, after compression, and must be XOR'ed again with the derived value before being decompressed. If an owner-id is specified for a document, the metadata record must exist, and must contain an OwnerID subrecord giving the CRC-32 of the owner-id string.

The derived value mentioned above is a 40-byte value constructed by forming 10 strings by concatenating the owner-id string with itself 2, 3, 4, 5, 6, 7, 8, 9, 10, and 11 times, then taking the CRC-32 values of each of these concatenations, then packing those 32-bit values in big-endian order into a 40-byte buffer.


Text data records

For text data the data record header is followed by a series of paragraph headers, each representing a paragraph block in the text data. This series of paragraph headers is then followed by the compressed or uncompressed text data. Each paragraph header has the form:

Field Bytes Type Notes
size 2 Numeric Total length of paragraph before compression. NOTE: No text data should be larger than 32k. If the original document is larger than 32k, then the parser must split it into several records.
attributes 2 Bitfield Paragraph info. The high-order 13 bits are reserved for future use and should be set to zero; the 3 low-order bits contain a numeric value in the range [0..7] giving the amount of extra paragraph spacing (2*value pixels).

The (uncompressed) text data contains a character stream of ISO Latin-1 characters, interspersed with 'functions'.

A function is introduced in the text stream by a NULL character (0x00), followed by a one-byte function code and up to 7 bytes of data. The 3 LSB of the function code represent the remaining function data length; the 5 MSB denote the actual function code. The following functions are valid:

Function Code Description Bytes Arguments
0x0A Page link begins 2 record ID
0x0C Paragraph link begins 4 record ID, paragraph offset
0x08 Link ends 0 no data
0x11 Set font 1 font specifier
0x1A Embedded image 2 image record ID
0x22 Set margin 2 left margin, right margin
0x29 Alignment of text 1 alignment
0x33 Horizontal rule 3 8-bit height, 8-bit width (pixels), 8-bit width (%, 1-100)
0x38 New line 0 no data
0x40 Italic text begins 0 no data
0x48 Italic text ends 0 no data
0x53 Set text color 3 8-bit red, 8-bit green, 8-bit blue
0x5C Multiple embedded image 4 alternate image record ID, image record ID
0x60 Underline text begins 0 no data
0x68 Underline text ends 0 no data
0x70 Strike-through text begins 0 no data
0x78 Strike-through text ends 0 no data
0x83 16-bit Unicode character 3 alternate text length, 16-bit unicode character
0x85 32-bit Unicode character 5 alternate text length, 32-bit unicode character
0x8E Begin custom font span 6 font page record ID, X page position, Y page position
0x8C Adjust custom font glyph position 4 X page position, Y page position
0x8A Change font page 2 font record ID
0x88 End custom font span 0  
0x90 Begin new table row 0  
0x92 Insert table (or table link) 2 table record ID
0x97 Table cell data 7 8-bit alignment, 16-bit image record ID, 8-bit columns, 8-bit rows, 16-bit text length

The function arguments have the following definitions:

Argument Bytes Notes
record ID 2 This is either a reference to a record in Plucker document (that is, a real record ID), or an index into the list of URLs, for URLs which have not been included in the document.
image record ID 2 reference to image in Plucker document
paragraph offset 2 paragraph number (starting from 0) to jump to
font specifier 1 The font concept used in Plucker is that of a 'standard' font, along with bold and italic versions of that font. There is no font notion corresponding to HTML's <BIG> or <SMALL>. In this markup, boldness and size are specified with a font specifier; italic is specified with a separate function code. There are currently 11 font specification values, with the following meanings (the actual PalmOS fonts used by the Palm viewer are also given):
Value Description PalmOS 2.x PalmOS 3.x
0 Regular text. stdFont stdFont
1 Suitable for <H1> HTML tags. boldFont largeBoldFont
2 Suitable for <H2> HTML tags. boldFont largeBoldFont
3 Suitable for <H3> HTML tags. boldFont largeFont
4 Suitable for <H4> HTML tags. boldFont largeFont
5 Suitable for <H5> HTML tags. stdFont boldFont
6 Suitable for <H6> HTML tags. stdFont boldFont
7 Regular text, but bold. stdFont boldFont
8 Fixed-width text, suitable for <TT> HTML tags. stdFont fixedWidthFont
9 Small normal text, suitable for <SMALL> HTML tags. stdFont stdFont
10 Small subscript text, suitable for <SUB> HTML tags. stdFont stdFont
11 Small superscript text, suitable for <SUP> HTML tags. stdFont stdFont
left margin 1 left margin in pixels
right margin 1 right margin in pixels
alignment 1 alignment code (left = 0, right = 1, center = 2, justify = 3)
height 1 height of horizontal rule in pixels, if not given a default value of 2 pixels will be used
width (pixels) 1 width in pixels, should be 0 if percentage value should be used
width (%) 1 width as the percentage between the current left and right margins. The default is 100%
alternate text length 1 When a Unicode character not representable in ISO-Latin-1 is encountered in an HTML document, a Unicode-character function code is inserted, with the 16-bit or 32-bit value of the character. This is followed by a "alternate representation" of the character in ISO-Latin-1 text. This parameter gives the length, in bytes, of the alternate text span. If the viewer can present the Unicode character directly, display of the alternate text should be suppressed.
16 or 32 bit Unicode character 2, 4 When a Unicode character not representable in ISO-Latin-1 is encountered in an HTML document, a Unicode-character function code is inserted, with the 16-bit or 32-bit Unicode character code for the character, which this parameter supplies. This is followed by a "alternate representation" of the character in ISO-Latin-1 text. If the viewer can present the Unicode character directly, display of the alternate text should be suppressed.


Image data records

The image data consists of an image in Palm image format, compressed or uncompressed as specified in the document's index record. The image may in addition be internally compressed, via any of the compression techniques allowed in the Palm image format. The fundamental size of an image must be less than 480,000; this size is calculated by multiplying the width (in pixels) by the height (in pixels) by the depth (in bits).

If the fundamental size is greater than 480,000, most parsers can be told to create a Multi-image group. This is a group of image records consisting of parts of the image which the viewer displays as one image. The parts are standard Image data records and the Multi-image record tells how many columns and rows the image has, and the record numbers of the parts.
Field Bytes Type Notes
columns 2 Numeric number of columns in this image
rows 2 Numeric number of rows in this image
image record IDs 2 * columns * rows Numeric References to images in Plucker document. There are (columns * rows) images listed here


Mailto data records

The mailto data contains info about e-mail addresses that are referenced by the mailto anchors. All the offsets are counting from the end of the header.
Field Bytes Type Notes
to_offset 2 Numeric offset to TO string
cc_offset 2 Numeric offset to CC string
subject_offset 2 Numeric offset to SUBJECT string
body_offset 2 Numeric offset to BODY string
strings 0+ String sequence A concatenated sequence of one or more NUL-terminated US-ASCII strings. Each contains a header-value, which follows the contraints on header values laid down in IETF RFC 2822. Header folding is not allowed. Any of the four headers shown above may be absent; header values should be accessed via the above offsets.


URL handling data records

Optionally, URL information for the records in the document may be stored. This information includes URL strings both for the pages actually included in the document, and for those pages excluded from the document. This information is conceptually stored as a sequence of strings, where the position of the URL in the sequence corresponds to the record ID of its page in the document. In the case of a page which is not actually included in the document, a pseudo-record-ID is assigned, greater than any actual record IDs in the document, and the URL of that page is associated with that pseudo-record-ID.

In practice, there are two kinds of records used to store the URL strings, the URL handling data record, which serves as an index into the sequence of strings, and the URL data record, one or more of which contain the actual strings.

The URL handling data is used to find the record ID of the record which contains the correct URL string. It contains a series of 2 byte number pairs.
Field Bytes Type Notes
last_url 2 Numeric the ordinal number of the last URL in record
id 2 Numeric record ID for record


URL data records

The URL data contains a list of the URLs. Additional records are created if needed and contain up to 200 URLs.
Field Bytes Type Notes
URLs 1+ String sequence a concatenated sequence of NUL-terminated URL strings following the constraints of IETF RFC 1738. The list may contain up to 200 URLs (only text and image records are included, other records are represented only by the presence of a NUL; that is, by an empty string)

These records may or may not be compressed. This is indicated by the type in the header. These records are used by the Details form to display the URL of the current record and by the External Reference form to display the URL of not collected pages. From either form you can copy the URL to a Memo to remind you to pluck it at a later date.


External Bookmarks data records

The external bookmarks data contains a list of bookmarks added by the parser. It will work similar to named anchors.
Field Bytes Type Notes
bookmarks 2 Numeric number of bookmarks
offset 2 Numeric offset to the start of the bookmark data (counting from the beginning of the record)
names variable size String sequence A concatenated sequence of NUL-terminated strings, each a bookmark name
bookmark_data 4*bookmarks Bookmark Data block of data for the location of the external bookmarks (see below)

The bookmark data is a series of uid/offset pairs.

Field Bytes Type Notes
uid 2 Numeric unique ID for record
offset 2 Numeric paragraph offset


Default Category data records

Each Plucker document can be assigned to a number of named categories. This record stores the names of default categories for the document. The data consists of a concatenated series of NUL-terminated strings that should be used as the default category/categories for this document.


Metadata data records

There should only be one of these per document. This record begins with a two byte numeric value, giving the number of subrecords that follow, followed by that number of subrecords. The subrecords are a sequence of tagged variable length items. Each subrecord consists of three fields:

Field Type Bytes Description
type code Numeric 2 Specifies what piece of extra information is in this subrecord
length Numeric 2 Number of 2-byte words in the argument
argument (type code specific) 2 * length Data

The following table describes the valid subrecord type codes, and describes the structure of the associated data for each subrecord type. Subrecords with unknown type codes should be ignored.

Type code Name Description Argument
1 CharSet This is the character set and encoding used by text records in this document, unless otherwise specified for particular records. a two-byte numeric value, specifying the IETF IANA MIBenum value for the character set. See the IANA registry of character sets for valid values.
2 ExceptionalCharSets This is a list of text records which use a charset other than that specified by the default CharSet. Note that if no default CharSet is specified, the default charset should be thought of as "unknown". a sequence of (length / 2) record-ID, IANA-MIBenum pairs, where MIBenum values are as specified for CharSet. The invalid MIBenum value of 0 (zero) is used for records which have an unknown charset, if necessary.
Field Bytes Type Notes
record ID 2 Numeric unique ID for record
MIBenum 2 Numeric IANA MIBenum for the character set used in this record
3 OwnerID This is the CRC-32 of the specified owner-id for the document, if any. Note that associating an owner-id with a document also affects the calculation of zlib compression. a four-byte numeric value giving the CRC-32 of the owner-id string.
4 Author The name of the author of the document. A string value in the document's default character set, padded at the end with NUL characters to an even number of bytes.
5 Title The full title of the document. A string value in the document's default character set, padded at the end with NUL characters to an even number of bytes.
6 PublicationDate The date and time this document was created. A 4-byte unsigned integer giving the number of seconds from 12:00 AM on January 1, 1904, to the time when this document was created.


Style Sheet data records

TBD


Font Page data records

TBD


Table data records

The Table Record describes an HTML table. It begins with a structure with the following format.

Field Type Bytes Description
size Numeric 2 Size of the following data
columns Numeric 2 Number of columns the table contains
rows Numeric 2 Number of rows the table contains
depth Numeric 1 Bits per pixel (BPP) needed to render the table
border Numeric 1 Draw table borders (0 = no, any other value = yes, 1 pixel wide)
border color Numeric 4 RGB value of border color
link color Numeric 4 RGB value of link color

This is followed by table row and table cell functions (their ends are implied). Each table cell function is followed by 'text length' (from the function) text, containing text and/or formatting functions. (Such as links, style, underline, strike through, italic, etc.)


© Copyright 2000 Michael Nordström <micke@sslug.dk> · Copyright 2001 Bill Janssen <bill@janssen.org $Id: DBFormat.html,v 1.22 2004/04/04 07:13:46 nordstrom Exp $
plucker-1.8/docs/plucker-setup.10100644000076400001440000000077207425644743015705 0ustar mickeusers.\" plucker-setup.1 .TH PLUCKER-SETUP 1 "Plucker 1.1 - http://plkr.org/" .SH NAME plucker-setup \- set up Plucker for the current user .SH SYNOPSIS \fBplucker-setup\fR .SH DESCRIPTION .B plucker-setup installs the default configuration files in the users home directory and optionally installs the client application, the ZLib shared library and a sample document on the Palm device. .SH "AUTHOR" Michael Nordstrom Report bugs to http://bugs.plkr.org or plucker-1.8/docs/Advanced.tex0100644000076400001440000002315007712230705015226 0ustar mickeusers% % $Id: Advanced.tex,v 1.8 2003/07/31 15:12:05 desrod Exp $ % \chapter{Advanced Topics} \section{POST Requests} Plucker can send \longcode{description file}{POST} requests to a host, just like an HTML form does. It will store the resulting page in the document. Until a parser can be written to create the requests from an HTML form they must be built by hand. \emph{If you have written or would be able to write such a parser, contact \devaddress}\\ \code{POST} requests take this form: \begin{verbatim} "http://harvest.weather.com/cgi-bin/3com/avantgo/palmpilot_city_search.pl" POST="city_destination=46552&action=Go" \end{verbatim} This URL will get the weather forecast for New Carlisle, In. (zip code 46552). The entry in \name{home.html} would be: \begin{verbatim} Weather

\end{verbatim} Substitute your zip code to get your local forecast. To obtain a palm friendly map from mapquest.com takes a little doing. First point your browser to \htmladdnormallink{www.mapquest.com} {http://www.mapquest.com} and follow the directions to get a map of the area of interest. Then click on the \option{Printer-Friendly Map} link in the left column.\\ \note{} \emph{These instructions are for Netscape, IE should be similar}\\ When the full page map appears, right click on the map and select \option{View Image} from the menu. After the image (by itself) has loaded add the current link to your bookmarks and exit your browser. Open the bookmark file (\name{~/.netscape/bookmarks.html}) in a text editor and find the entry. Mine looked like this: \begin{verbatim} GIF image 600x600 pixels \end{verbatim} \begin{latexonly} This is actually a \code{GET} request. Even though Plucker understands \code{GET} requests, we will change it to \code{POST}. Copy the line to another file for editing and open that file. Remove everything from \code{ADD\_DATE} to the quote(") before \code{>GIF}. You can insert plucker options here like \code{MAXWIDTH=300 MAXHEIGHT=300} (to increase the map size on your palm). You may also change the next part (between the \textgreater and \textless). This will be the link that appears on your \name{Plucker Home Page}. Mine now looks like this: \end{latexonly} \begin{htmlonly} This is actually a \code{GET} request. Even though Plucker understands \code{GET} requests, we will change it to \code{POST}. Copy the line to another file for editing and open that file. Remove everything from \code{ADD\_DATE} to the quote(") before \code{>GIF}. You can insert plucker options here like \code{MAXWIDTH=300 MAXHEIGHT=300} (to increase the map size on your palm). You may also change the next part (between the > and <). This will be the link that appears on your \name{Plucker Home Page}. Mine now looks like this: \end{htmlonly} \begin{verbatim} New Carlisle Map \end{verbatim} Finally, copy the line into your \name{home.html} and pluck your map!\\ \note{} In the example above the \code{HREF=} part is actually the name of a program the server will run for you. The \code{POST=} part contains the parameters for the program. \section{Perl-based Conduit} The Perl-based Conduit is listed in the advanced topics as you actually would hardly need it anymore and it is only referenced for your convenience as it still exists (for historical reasons) and of course still works. You can use it to transfer your document to your Palm OS handheld device. It is useful in several scenarios: \begin{itemize} \item You want to sync Plucker as well as several other data to your Palm OS handheld device using some other conduit written using pilot-links famous Perl interface. In this case it is possible to move several different data with only pressing hotsync once. This is not possible using the output to a pdb as you would need to transfer your data with e.g.\ pilot-link (press hotsync for the first time) and then this program ends the connection to your PDA and after that you can fire up your other conduits. \item As it is Perl based you might want to use it to build your own conduit for Pilot-Manager e.g. \item It can serve you as a sample on how to create, delete and write documents on your handheld \item In case of very limited RAM\. This sounds somewhat strange, but the Perl conduit works completely different than the pdb output. The Perl conduit assembles the document on the device itself while it syncs the records to it, that is you sync on a per record basis. Now if you have several documents to sync but low free RAM on your device the Perl conduit will not refuse to sync in a document even if it does not fit to your device completely. It will simply sync in the data till you are out of memory and any remaining records are left out. This will lead to a effective use of \emph{every byte}. But you should be aware of two points here: \begin{enumerate} \item If some records are missing you will get an \emph{external reference}-error even if the documents where plucked originally. \item Since you already have low free space on your device it might happen that the conduit syncs in as many datasets that you are unable to open even your home document. In this case you need to free up RAM by removing documents from Document Library. \end{enumerate} That is why we consider the use of the Perl conduit in low RAM conditions as an hazardous task better left to advanced users. The Perl conduit has absolutely no problem with syncing in data till you even can not add a new appointment or phone number. You should be aware of how to handle this. \end{itemize} \subsubsection{Usage} OK, enough for the introductory stuff now about the usage of the Perl based conduit. The synopsis:\\ \begin{latexonly} \option{sync.pl} \textbf{[-{}-name=\emph{names} -{}-cache=\emph{cachedirs} [-{}-database] [-{}-port=\emph{comport}]]}\\ \end{latexonly} \begin{htmlonly} \textbf{sync.pl} \textbf{[---name=\emph{names} ---cache=\emph{cachedirs} [---database] [---port=\emph{comport}]]} \index{sync.pl} \end{htmlonly}\\ \note{} On OS/2 and Windows there exists (by default) no mechanism for the shell to determine that this script should be invoked through the Perl interpreter. (On Unix this is specified in the first line of the script, but OS/2 and Windows do not evaluate this information.) For that reason you must specify the call to your Perl interpreter before the call to sync.pl. So it will look like this: \code{perl sync.pl\ldots}\\ The parameters \begin{itemize} \item \option{None}: This will work as it did in earlier versions of Plucker since this conduit came up for the first time. It will sync one document called \name{PluckerDB} created from files in \code{\$PLUCKERDIR}. This call is really a leftover compatibility to early versions of Plucker so people who used that setup were not required to change there setup on changing the version of Plucker. \begin{latexonly} \item \longoption{sync.pl}{-{}-names=\emph{names}}: Here you specify the name(s) of the document(s) that should be created on your Palm OS handheld device. In case of several names they are separated by spaces. \item \longoption{sync.pl}{-{}-cache=\emph{cachedirs}}: Use it to specify the \name{cache} directory used by the document(s). \end{latexonly} \begin{htmlonly} \item \longoption{sync.pl}{---names=\emph{names}}: Here you specify the name(s) of the document(s) that should be created on your Palm OS handheld device. In case of several names they are separated by spaces. \item \longoption{sync.pl}{---cache=\emph{cachedirs}}: Use it to specify the \name{cache} directory used by the document(s). \end{htmlonly} \note{} If you use several documents there is a 1:1 correspondence between the names and cachedirs, that is the first document will be named using the first name in the names list form the first cache dir in the cache-list. If this is not provided it will stop. For your convenience the conduit writes the names and the corresponding directories to the screen. Unlike the other programs and scripts used with Plucker the conduit does not follow the Unix convention of \emph{no news is good news} but will tell you all its actions in detail. \note{} The conduit checks if there are equal numbers of parameters for names and cache dirs. \begin{latexonly} \item \longoption{sync.pl}{-{}-database}: Will not sync to the Palm but create documents instead. \end{latexonly} \begin{htmlonly} \item \longoption{sync.pl}{---database}: Will not sync to the Palm but create documents instead. \end{htmlonly} \note{} This routine is implemented through pilot-links Perl-interface which seems to have some bugs in this routine. At least running on OS/2 you do not get a usable document all the time. \begin{latexonly} \item \longoption{sync.pl}{-{}-port=\emph{port}}: You might specify the COM port used for synchronization. \end{latexonly} \begin{htmlonly} \item \longoption{sync.pl}{---port=\emph{port}}: You might specify the COM port used for synchronization. \end{htmlonly} \end{itemize} plucker-1.8/docs/plucker-decode.10100644000076400001440000000211207425644743015756 0ustar mickeusers.\" plucker-decode.1 .TH PLUCKER-DECODE 1 "Plucker 1.1 - http://plkr.org/" .SH NAME plucker-decode \- parses the Plucker cache file(s) .SH SYNOPSIS \fBplucker-decode\fR [-h] [-v] [-s] [-S] [-d] [-z] ... .SH DESCRIPTION .B plucker-decode This tool disassembles files generated by the Plucker parser (or any other Plucker compatible parser) and collects statistics about the disassembled documents. If you get a traceback with an assertion error, something is wrong in the data file or the data is compressed with ZLib and you forgot to specify the -z option. .SH OPTIONS .TP \fB-h\fR display usage information and exit .TP \fB-v\fR output version information and exit .TP \fB-s\fR show statics for each document .TP \fB-S\fR show summary statistics for all documents .TP \fB-d\fR show disassembly information for each document .TP \fB-z\fR use ZLib to uncompress the documents .SH "SEE ALSO" plucker-dump(1) .SH "AUTHOR" Holger Duerer (man page by Michael Nordstrom, ) Report bugs to http://bugs.plkr.org or plucker-1.8/unix/0040755000076400001440000000000010052675410013031 5ustar mickeusersplucker-1.8/unix/setup.py.in0100644000076400001440000001212510027321126015140 0ustar mickeusers#!/usr/bin/env python """ $Id: setup.py.in,v 1.21 2004/03/21 14:10:30 nordstrom Exp $ Set up Plucker for the current user Copyright 2000 Michael Nordstrom Distributable under the GNU General Public License Version 2 or newer. """ import string, sys, os, shutil VERSION="@VERSION@" CONFIGDIR=os.path.join("@PLUCKERDIR@","config") PALMDIR=os.path.join("@PLUCKERDIR@", "palm") if os.environ.has_key ('HOME'): USERDIR = os.environ["HOME"] PLUCKER = os.path.join(os.environ["HOME"], ".plucker") else: # this shouldn't happen on a Unix/Linux system sys.exit(1) def get_answer(question, default = 'n'): while 1: answer = raw_input (question + "? [" + default + "] ") if answer: if answer == 'y' or answer == 'Y': ret = 1 break elif answer == 'n' or answer == 'N': ret = 0 break else: print "Please answer y or n" else: if default == 'y' or default == 'Y': ret = 1 else: ret = 0 break return ret def install_config_files(): print "Copying default config files..." PLUCKERRC="pluckerrc" if os.path.isfile(os.path.join(CONFIGDIR, PLUCKERRC + ".sample")): if os.path.isfile(os.path.join(USERDIR, "." + PLUCKERRC)): print "The configuration file .%s already exists in your home directory." % PLUCKERRC if get_answer("Do you wish to replace it"): shutil.copy(os.path.join(CONFIGDIR, PLUCKERRC + ".sample"), os.path.join(USERDIR, "." + PLUCKERRC)) else: shutil.copy(os.path.join(CONFIGDIR, PLUCKERRC + ".sample"), os.path.join(USERDIR, "." + PLUCKERRC)) for file in [ "home.html", "exclusionlist.txt" ]: if os.path.isfile(os.path.join(CONFIGDIR, file)): if os.path.isfile(os.path.join(PLUCKER, file)): print "The configuration file %s already exists in your Plucker directory." % file if get_answer("Do you wish to replace it"): shutil.copy(os.path.join(CONFIGDIR, file), os.path.join(PLUCKER, file)) else: shutil.copy(os.path.join(CONFIGDIR, file), os.path.join(PLUCKER, file)) def install_viewer(): viewers = ( ( 'English', 'viewer_en.prc' ), ( 'German', 'viewer_de.prc' ), ( 'Czech', 'viewer_cs.prc' ), ( 'Italian', 'viewer_it.prc' ), ( 'French', 'viewer_fr.prc' ), ( 'Japanese', 'viewer_ja.prc' ), ( 'Faeroese', 'viewer_fo.prc' ), ( 'Danish', 'viewer_da.prc' ), ( 'Chinese (simplified)', 'viewer_zh_CN.prc' ), ( 'Polish', 'viewer_pl.prc' ), ( 'Russian', 'viewer_ru.prc' ), ( 'Spanish', 'viewer_es.prc' ), ( 'Turkish', 'viewer_tr.prc' ), ( 'Thai', 'viewer_th.prc' ), ( 'Catalan', 'viewer_ca.prc' ), ( 'Norwegian', 'viewer_no.prc' ) ) if get_answer("\nInstall the Palm applications on your Palm OS handheld", 'y'): print "\n Select one of the following versions:\n" index = 1 for viewer in viewers: print " %d. %s" % (index, viewer[0]) index = index + 1 print " q. Abort" while 1: answer = raw_input("\n Enter choice: [q] ") if answer: try: n_answer = int(answer) if 1 <= n_answer and n_answer <= len(viewers): viewer = os.path.join(PALMDIR, viewers[int(answer) - 1][1]) break else: print " Please answer 1 to %d or q." % len(viewers) except ValueError or TypeError: if answer == 'q': return else: print " Please answer 1 to %d or q." % len(viewers) else: return zlib = "" if get_answer("\nInstall the ZLib library, too", 'y'): zlib = os.path.join(PALMDIR, "SysZLib.prc") guide = "" if get_answer("Install the User's Guide, too", 'y'): guide = os.path.join(PALMDIR, "PluckerUserGuide.pdb") os.system("pilot-xfer -i %s %s %s" % (viewer, zlib, guide)) # # Main # if __name__ == '__main__': import getopt, os print "\nSetting up Plucker %s in %s...\n" % (VERSION, USERDIR) if os.getuid() == 0: print "You may wish to answer NO and run plucker-setup using your normal login." print "Plucker-setup will install files in your HOME directory." if not get_answer("Continue"): sys.exit(0) if not os.path.exists(CONFIGDIR): print "Could not find config files" sys.exit(1) if not os.path.exists(USERDIR): print "Could not find user directory %s" % USERDIR sys.exit(1) if not os.path.exists(PLUCKER): print "Creating default Plucker directory (%s)" % PLUCKER os.makedirs(os.path.join(PLUCKER, "cache")) install_config_files() if not os.system('pilot-xfer > /dev/null 2>&1'): install_viewer() else: print "\nThe program 'pilot-xfer' is missing so the Palm applications cannot be installed. You'll find them in %s." % PALMDIR print "\nInstallation Finished\n" plucker-1.8/unix/install-plucker0100755000076400001440000001323510052666606016100 0ustar mickeusers#!/usr/bin/env python """ $Id: install-plucker,v 1.74.4.1 2004/05/19 14:21:58 nordstrom Exp $ Install Plucker on a Unix/Linux system Copyright 2000 Michael Nordstrm Distributable under the GNU General Public License Version 2 or newer. """ import string, sys, os, shutil VERSION="1.8" # are we using the binary package or the source package? BINPKG='@@BINPKG@@' # default install targets TARGET="install-prc-files install-manual install-data" # set up the Python environment PYTHON_LIBVER = string.split(sys.version)[0] while '.' in PYTHON_LIBVER: trim = PYTHON_LIBVER[:string.rfind(PYTHON_LIBVER, '.')] if '.' not in trim: break PYTHON_LIBVER = trim PYTHON_LIBDIR=os.path.join(os.path.join(sys.prefix, 'lib'),'python%s' % PYTHON_LIBVER) MODULE_DIR=os.path.join(PYTHON_LIBDIR, "site-packages") def get_answer(question, default = 'n'): while 1: answer = raw_input (question + "? [" + default + "] ") if answer: if answer == 'y' or answer == 'Y': ret = 1 break elif answer == 'n' or answer == 'N': ret = 0 break else: print "Please answer y or n" else: if default == 'y' or default == 'Y': ret = 1 else: ret = 0 break return ret # # Main # print "\nThis script will guide you through the installation of Plucker %s" % VERSION print "If you run this script as root the default values should be OK, if you" print "want to install Plucker as a normal user you have to change the paths." MAKE = "gmake" if os.system('gmake --version | grep GNU > /dev/null 2>&1'): MAKE = "make" if os.system('make --version | grep GNU >/dev/null 2>&1'): print "\nGNU Make is required to run this script\n" sys.exit(1) CONFIGOPT="" PREFIX="/usr/local" answer = raw_input("\nInstallation path prefix [" + PREFIX + "]: ") if answer: PREFIX=answer CONFIGOPT = CONFIGOPT + " --prefix=%s" % PREFIX BIN_DIR=os.path.join(PREFIX, "bin") answer = raw_input("In which directory do you want to install the binary files [" + BIN_DIR + "]: ") if answer: BIN_DIR=answer CONFIGOPT = CONFIGOPT + " --bindir=%s" % BIN_DIR MOD_DIR="" init_py = os.path.join(MODULE_DIR, "PyPlucker", "__init__.py") if not (os.path.exists(init_py) and get_answer("Use existing Python parser in %s" % MODULE_DIR)): TARGET = TARGET + " install-pyplucker" if get_answer("Install Python parser in default location for site packages, %s" % MODULE_DIR): MOD_DIR=MODULE_DIR else: MOD_DIR=PREFIX answer = raw_input("In which directory do you want to install the Python parser [" + MOD_DIR + "]: ") if answer: MOD_DIR=answer CONFIGOPT = CONFIGOPT + " --with-pypluckerdir=%s" % os.path.join(MOD_DIR, "PyPlucker") PLUCKERDIR=os.path.join(PREFIX, "share", "plucker") answer = raw_input("In which directory do you want to install the Plucker data [" + PLUCKERDIR + "]: ") if answer: PLUCKERDIR=answer CONFIGOPT = CONFIGOPT + " --with-pluckerdir=%s" % PLUCKERDIR answer = raw_input("In which directory do you want to install the documentation [" + os.path.join(PLUCKERDIR, "doc") + "]: ") if answer: CONFIGOPT = CONFIGOPT + " --with-docdir=%s" % answer PLUCK_COMICS='no' if get_answer("Do you want to install pluck-comics (used to gather comics from selected websites)", 'y'): TARGET = TARGET + " install-pluck_comics" PLUCK_COMICS='yes' answer = raw_input(" In which directory do you want to put the downloaded comics [/var/spool/netcomics]: ") if answer: CONFIGOPT = CONFIGOPT + " --with-comicsdir=%s" % answer if BINPKG == 'yes' or not get_answer("Do you want to build the documentation", 'y'): CONFIGOPT = CONFIGOPT + " --disable-docbuild" if BINPKG == 'yes' or not get_answer("Do you want to build the viewer and ZLib binaries", 'y'): CONFIGOPT = CONFIGOPT + " --disable-palmosbuild" #if BINPKG == 'yes': #CONFIGOPT = CONFIGOPT + " --disable-desktopbuild" #if get_answer("Do you want to install the GUI desktop tool", 'y'): #TARGET = TARGET + " install-desktop" #elif not get_answer("Do you want to build the GUI desktop tool", 'y'): CONFIGOPT = CONFIGOPT + " --disable-desktopbuild" print "\nRunning ./configure%s\n" % CONFIGOPT os.system("cd .. && ./configure%s" % CONFIGOPT) if not get_answer("Continue", 'y'): sys.exit(1) print "\nRunning GNU make...\n" os.system("cd .. && %s && %s %s" % (MAKE,MAKE,TARGET)) if BIN_DIR: if not MOD_DIR: MOD_DIR=MODULE_DIR if os.path.exists(os.path.join(BIN_DIR, "plucker-build")): os.remove(os.path.join(BIN_DIR, "plucker-build")) os.symlink(os.path.join(MOD_DIR, "PyPlucker", "Spider.py"), os.path.join(BIN_DIR, "plucker-build")) if os.path.exists(os.path.join(BIN_DIR, "plucker-decode")): os.remove(os.path.join(BIN_DIR, "plucker-decode")) os.symlink(os.path.join(MOD_DIR, "PyPlucker", "PluckerDocs.py"), os.path.join(BIN_DIR, "plucker-decode")) if os.path.exists(os.path.join(BIN_DIR, "plucker-dump")): os.remove(os.path.join(BIN_DIR, "plucker-dump")) os.symlink(os.path.join(MOD_DIR, "PyPlucker", "Decode.py"), os.path.join(BIN_DIR, "plucker-dump")) if PLUCK_COMICS == 'yes': if os.path.exists(os.path.join(BIN_DIR, "pluck-comics")): os.remove(os.path.join(BIN_DIR, "pluck-comics")) os.symlink(os.path.join(MOD_DIR, "PyPlucker", "pluck-comics.py"), os.path.join(BIN_DIR, "pluck-comics")) if os.getuid() != 0 and os.path.exists(os.path.join(BIN_DIR, "plucker-setup")) and get_answer("\nDo you want to run plucker-setup now", 'y'): os.system(os.path.join(BIN_DIR, "plucker-setup")) plucker-1.8/unix/plucker.spec0100644000076400001440000001103110052674313015344 0ustar mickeusers# # $Id: plucker.spec,v 1.9.4.2 2004/05/19 15:10:03 nordstrom Exp $ # # Spec file for Plucker # # Copyright (c) 2001 Michael Nordstrom # # This file 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. # Name: plucker Version: 1.8 Release: 1 Group: None Summary: Offline HTML reading for Palm devices License: GPL URL: http://www.plkr.org/ Source0: plucker_viewer-%{version}.tar.bz2 Source1: plucker_viewer_extras-%{version}.tar.bz2 Source2: plucker_viewer_translations-%{version}.tar.bz2 Source3: plucker_parser-%{version}.tar.bz2 Source4: plucker_docs-%{version}.tar.bz2 Source5: setup.py.in Requires: python BuildRoot: %{_tmppath}/%{name}-%{version}-root %description Plucker increase the utility of your handheld device by letting you view web pages and any document that can be converted to HTML or text. Plucker has many advanced features including the ability to read web pages with embedded images, an advanced find function, the ability to open an e-mail form when tapping on mail-links in web documents, an impressive compression ratio for the documents and an open, documented format. It can also be customized for your specific needs. %prep %setup -q -T -b0 -b1 -b2 -b3 -b4 cp %{_sourcedir}/setup.py.in %{_builddir}/%{name}-%{version} %build # nothing at the moment... %install %define PyPluckerDir %{_libdir}/python/site-packages/PyPlucker %define DataDir %{_datadir}/plucker %define DocDir %{_datadir}/doc/packages/plucker rm -rf %{buildroot} # Viewer mkdir -p %{buildroot}/%{DataDir}/palm install -m 755 *.prc %{buildroot}/%{DataDir}/palm install -m 755 *.pdb %{buildroot}/%{DataDir}/palm install -m 755 ppi/*.prc %{buildroot}/%{DataDir}/palm install -m 755 xlit/*.pdb %{buildroot}/%{DataDir}/palm install -m 755 imode/*.pdb %{buildroot}/%{DataDir}/palm # Python Parser mkdir -p %{buildroot}/%{PyPluckerDir}/helper install -m 755 PyPlucker/*.py %{buildroot}/%{PyPluckerDir} install -m 755 PyPlucker/helper/*.py %{buildroot}/%{PyPluckerDir}/helper # Config files mkdir -p %{buildroot}/%{DataDir}/config install -m 644 exclusionlist.txt %{buildroot}/%{DataDir}/config install -m 644 home.html %{buildroot}/%{DataDir}/config install -m 644 pluckerrc.sample %{buildroot}/%{DataDir}/config mkdir -p %{buildroot}/%{_bindir} sed -e "s:@VERSION@:%{version}:" \ -e "s:@PLUCKERDIR@:%{DataDir}:" setup.py.in > setup.py install -m 755 setup.py %{buildroot}/%{_bindir}/plucker-setup #Documentation mkdir -p %{buildroot}/%{DocDir}/manual install -m 644 manual/* %{buildroot}/%{DocDir}/manual install -m 644 AUTHORS BUGREPORT COPYING CREDITS ChangeLog %{buildroot}/%{DocDir} install -m 644 FAQ NEWS README REQUIREMENTS %{buildroot}/%{DocDir} mkdir -p %{buildroot}/%{_mandir}/man1/ install -m 644 plucker-build.1 %{buildroot}/%{_mandir}/man1/ install -m 644 plucker-decode.1 %{buildroot}/%{_mandir}/man1/ install -m 644 plucker-dump.1 %{buildroot}/%{_mandir}/man1/ %clean rm -rf %{buildroot} %post %define PyPluckerDir %{_libdir}/python/site-packages/PyPlucker python %{_libdir}/python/compileall.py %{PyPluckerDir} python -O %{_libdir}/python/compileall.py %{PyPluckerDir} # make sure we don't have some old cruft in the binary dir rm -f %{_bindir}/plucker-build rm -f %{_bindir}/plucker-decode rm -f %{_bindir}/plucker-dump # add links to parser tools ln -s %{PyPluckerDir}/Spider.py %{_bindir}/plucker-build ln -s %{PyPluckerDir}/PluckerDocs.py %{_bindir}/plucker-decode ln -s %{PyPluckerDir}/Decode.py %{_bindir}/plucker-dump %preun rm -f %{PyPluckerDir}/*.pyc rm -f %{PyPluckerDir}/*.pyo rm -f %{PyPluckerDir}/helper/*.pyc rm -f %{PyPluckerDir}/helper/*.pyo %postun rm -f %{_bindir}/plucker-build rm -f %{_bindir}/plucker-decode rm -f %{_bindir}/plucker-dump %files %{_bindir}/plucker-setup %doc %{_datadir}/doc/packages/plucker %{_mandir}/man1/plucker-build* %{_mandir}/man1/plucker-decode* %{_mandir}/man1/plucker-dump* %{_libdir}/python/site-packages/PyPlucker %{_datadir}/plucker %changelog -n plucker * Wed May 19 2004 - micke@sslug.dk - removed TODO file * Sun Mar 21 2004 - micke@sslug.dk - updated for new packaging format * Sun Aug 3 2003 - micke@sslug.dk - fix to remove links to parser tools * Fri May 23 2003 - micke@sslug.dk - updated to use new packages * Sun Jul 22 2001 - micke@sslug.dk - added version tag that will be set when the package is built * Sat Jul 21 2001 - micke@sslug.dk - moved the pluck-comics files inside the Plucker data dir * Sat Jul 14 2001 - micke@sslug.dk - initial version plucker-1.8/conduit/0040755000076400001440000000000010052674514013517 5ustar mickeusersplucker-1.8/conduit/README0100644000076400001440000001346007127430524014400 0ustar mickeusersWelcome to Plucker! ~~~~~~~~~~~~~~~~~~~ Here some remarks about the currently used sync.pl. This conduit is written completely in Perl using the Perl-Interface of Pilot-Link 0.9.2 (at least I tested with 0.9.2, but it may also work on other versions of Pilot-Link). The conduit doesn't depend much on the OS you're running. Currently it detects OS/2 automatically and treats all other OSs as Unix. This will fail if you use Plucker on DOS9x or NT. OS-dependend code: - Port to use: This is stored in a variable called $device. On OS/2 Plucker uses COM1 by default, on Unix it uses /dev/pilot. Please remember to set up an appropriate link. If you want to change this behaviour you may want to edit sync.pl and change the setting of $device. - home: On OS/2 you'll have to set the "home"-environment-variable manually. (On Unix this is done correctly by default.) Please insert to your CONFIG.SYS a line like SET HOME=F:\home if you want to use F:\home as your home-directory. Home is used to create a subdir called .plucker where plucker stores it's data. Currently it's not that easy to change that directory, cause you'll have to hack arround in the parser-awk's. Using the Conduit: ~~~~~~~~~~~~~~~~~~ This is quite easy. On Unix simply set an executable flag and call sync.pl from within a shell. (Note: For this to work it's necessary that perl exists in /usr/bin. If your distribution uses a diffrent path, pleas adapt the first line in sync.pl!). On OS/2 please use the call perl sync.pl or perl conduit-new.pl to invoke it. The OS/2-installation-routine will also place some object on your desktop (the small Tricorder) to invoke the conduit manually. Also at the end of the hotsync-process the conduit is called automatically so in normal circumstances you'll never want to call it yourself. That's all that has do be said about usage. Developers documentation ~~~~~~~~~~~~~~~~~~~~~~~~ All routine names and actions are as close as possible to the C-conduit this perl-port is based on. The source is quite well documented and simple, so you'll find all infos necessary directly in the source. The following modules are needed: PDA::Pilot The Perl-Interface from Pilot-Link Data::Dumper Included in standard Perl-distribution Env To read the environment How it works ~~~~~~~~~~~~ First of all the logo is displayed including the hint for the user to press hotsync-button. That is done in the routines Logo(); and Connect(); Actual connection to the Palm is done via calls ot PDA::Pilot::openPort() and PDA::Pilot::accept(). The variables $device store the device which should be used for transfer (COM1 or /dev/pilot) and $socket stores the socket created by opening the port. It's used in the conduit to actually transfer data. The $dlp-object is the "transfer-unit" which reads data from the pilot via $socket and writes data to the Pilot or executes API-calls on the Pilot through internal methods. Before any action takes place, the userinfo is read and the Palm is set to display the work currently done. That's the purpose of ShowUserInfo(). Note the calls to $dlp->getUserInfo and dlp->getStatus(). The informations are displayed on screen to inform the user about actions that take place. Now, that connection is estabilshed the database is removed. All work is done to PluckerDB. Removal of old PluckerDB and recreation is the easiest way to get a clean new database on the Palm. This is done in OpenConduitDB(). All actions are of course displayed to the user. Ok, now the actual transfer. addConduitFile() is the routine which does that. First of all the conduit opens $pcache, which is the directory $home/.plucker/cache This is the directory where the Plucker-parser stores the files that should be transfered to the Palm. At this point, sync.pl differs siginifcantly from old C-conduit. I don't take a long list of parameters including the files to transfer, I simply transfer the whole directory. This requires that the hotsync-job removes old entrys before new ones are placed there or you'll get some sort of memory-leak. If the directory can't be opened the conduit dies. In conduit-new.pl: ~~~~~~~~~~~~~~~~~ @files = grep !/^\./, readdir(PDir); for $file (sort {$a <=> $b} @files) { This goes through the directory of cache files, and creates an array which is used to populate the build function below for the database. It does this in a sorted fashion, so the records are put into the array in order. In sync.pl: ~~~~~~~~~~~~~ while (defined($file = readdir(PDir))) Walks through all files in the plucker-cache ignoring . and .. and transfers them to the pilot. It also notifies the user about which files are transfered and about there sizes. Note that the parser uses the record-id's in PluckerDB as filenames. All data from the file is read to $data for transfer. $rec = $db->newRecord(); creates a new record in PluckerDB, the following lines set the appropriate fields to the record, $db->setRecord($rec); actually transfers the data to the Palm. After transfer the datafile is closed, and the next one is processed. $syncsize count's up all filesizes transfered so sync.pl can inform the user about the size of the DB just created. After the whole transfer took place $db->close(); closes the db on the Palm and a final call to CloseConduitDB() notifies the user that the conduit is finished. Then the program exits. For comments, hints or problems with the sync.pl please mailto:a.wagner@teamos2.de or hacker@gnu-designs.com although this conduit was written for OS/2 and developed on OS/2 it's tested on Linux (SuSE 6.1 Beta, Slackware 3.6, and Redhat 6.1) and Solaris as well and worked there perfectly (SuSE 6.1Beta). plucker-1.8/conduit/source.w32/0040755000076400001440000000000010052664545015434 5ustar mickeusersplucker-1.8/conduit/source.w32/ConstStrings.pas0100644000076400001440000001753710027341433020601 0ustar mickeusers{********************************************************************} { } { Program Name: Strings Unit for Conduit.dpr } { Source Language: Delphi 3 } { Author: Dirk Heiser } { } {********************************************************************} { This unit is part of the Plucker conduit for Win32, see in } { Conduit.dpr for more Infos } { } {********************************************************************} UNIT ConstStrings; INTERFACE USES PalmConst; CONST Empty = ''; DBName = 'PluckerDB'; DBType = 'Data'; DBCreator = 'Plkr'; DBVersion = '1'; RecMax = mydmMaxRecSize; CacheDir = 'cache\'; DBFileName = 'PluckerDB.pdb'; Verbose = '1'; DBReservedLength = 0; DBNameSubstitute = '_'; Record_attrib = $0000; DBMinRecSize = 8; DBCTPOS = 8; DBMinIRecSize = 6; Index_Record = 1; Category_Record_ID = 3; Category_Record_CT = 9; RecName = 'DATA'; PythonNullTime = 25569; PQASignature = 'lnch'; PQAhdrVersion = 3; PQAencVersion = 0; BIGICON = 1; SMALICON = 2; VersionStr = '%s.0'; BigIconName = '%s_b.tbmp'; SmallIconName = '%s_s.tbmp'; STR_NonIcon = ''; ValidChars = ['0'..'9']; FileMask = '*.'; PathSep = '\'; Switchcount = 16; Switches : ARRAY [ 1..Switchcount ] OF STRING = ( '-user=', '-dir=', '-cache=', '-id=', '-dbname=', '-fname=', '-fix', '-dbversion=', '-install=', '-verbose=', '-copyprev', '-backup', '-launchable', '-icon', '-icon=', '-category=' ); CompressionTypes : ARRAY [ 0..2 ] OF STRING = ( 'UNKNOWN', 'DOC', 'ZLib' ); RESERVED_NAMES : ARRAY [ -2..4 ] OF STRING = ( 'UNKNOWN', 'Index Record', 'home.html', 'external bookmarks', 'URL handling', 'Category Record', 'Metadata Record' ); CT : ARRAY [ -2..10 ] OF STRING = ( 'UNKNOWN', 'none', 'PHTML', 'PHTML_COMPRESSED', 'TBMP', 'TBMP_COMPRESSED', 'MAILTO', 'LINK_INDEX', 'LINKS', 'LINKS_COMPRESSED', 'BOOKMARKS', 'CATEGORY', 'METADATA' ); S = ' '; L = #13#10; MSG_Welcome = L + S + 'ͻ' + L + S + ' Plucker conduit for Win32 Version 1.72 ' + L + S + 'ĺ' + L + S + ' (c) 1999-2002 by Dirk Heiser ' + L + S + ' ---o-o--- ' + L + S + ' ---o--o-- ' + L + S + ' ---o-o--- using TPalmUserData Class by Art Dahm ' + L + S + ' ---o----- ' + L + S + ' ---o----- Distributable under the GNU General Public ' + L + S + ' License Version 2 or newer. ' + L + S + 'ͼ' + L + L; MSG_Usage = 'Usage: conduit.exe -dir= [-user=] [-cache=]' + L + ' [-id=] [-dbversion=]' + L + ' [-dbname=] [-fname=] [-fix]' + L + ' [-install=] [-verbose=]' + L + ' [-copyprev] [-backup] [-launchable] [-icon[=]]' + L + ' [-category=]' + L + L + ' -dir : Dir where your Plucker Data are stored' + L + ' -user : Pilot user Name, if set DB will installed for Hotsync.' + L + ' Sepperate more users with ";".' + L + ' -cache : Dirname for you cache Dir. Default "' + CacheDir + '"' + L + ' -id : Creator ID for the Database. Default "' + DBCreator + '"' + L + ' -dbversion : Versions number for the Database. Default "' + DBVersion + '"' + L + ' -dbname : Database Name. Dafault "' + DBName + '"' + L + ' -fname : Filename for the Database. Default "' + DBFileName + '"' + L + ' -fix : 0x0D0A Sequenses are converted to 0x0A' + L + ' -install : Install a Pilot File. -User must be set, -dir not' + L + ' -verbose : Set the Verbose Level. Default are ' + Verbose + L + ' 0 = Verbosity level 0 is silent except for errors' + L + ' 1 = Verbosity level 1 gives progress status' + L + ' 2 = Verbosity level 2 is used for debugging' + L + ' -category : Preset the Category the DB belong to, enter the cat, Name' + L + ' -copyprev : Set the CopyPrevention Flag' + L + ' -backup : Set the Backup Flag' + L + ' -launchable : Set the Launchable Flag' + L + ' -icon : Add an Icon to the DB.' + L + ' : You can specify the Path&Filename to an Tbmp Bitmap.' + L + ' : E.g. -icon=myicon Points to a Big Icon called "myicon_b.tbmp"' + L + ' : and a Small Icon called "myicon_s.tbmp"' + L; MSG_Dir = 'Plucker Data Directory: %s'; MSG_User = 'Datababse is for User: %s'; MSG_Read_File = ' %s: Reading File "%s" [Record UID %s Size %s Bytes]'; MSG_Reading = 'Reading: %s'; MSG_DBType = 'Database compression type: %s'; MSG_Installing = 'Installing "%s" for: "%s"'; MSG_Done = ' --> Done.'; MSG_FileInfo = ' Data Type: %s Contens Type: %s'; MSG_Error_FileN = ' --> Fail.' + L + 'Wrong Filename: %s'; MSG_Error_FileR = ' --> Fail.' + L + 'Error Reading File: %s'; MSG_Error_Dir = 'No Files Found'; MSG_Error_Save = ' --> Fail.' + L + 'Error Saving "%s"'; MSG_Error_User = 'Error Installing Database for "%s"'; MSG_Error_UserNF = ' --> Fail.' + L + 'User "%s" not Exist'; MSG_Write_DB = 'Writing "%s" (%s kB)'; MSG_WriteDB_Info = ' ͻ' + L + ' Documents %s kB %s Byte %s%% ' + L + ' Images %s kB %s Byte %s%% ' + L + ' Mailto %s kB %s Byte %s%% ' + L + ' Links %s kB %s Byte %s%% ' + L + ' Bookmarks %s kB %s Byte %s%% ' + L + ' Unknown %s kB %s Byte %s%% ' + L + ' Header %s kB %s Byte %s%% ' + L + ' ĺ' + L + ' Summary %s kB %s Byte %s%% ' + L + ' ͼ'; MSG_Error_Size = ' --> Fail.' + L + 'Record to lage (max. is %s Bytes)'; MSG_Error_FNF = 'Error: File "%s" not Found'; MSG_Error_Index = 'Error: Index_Record (Record 1) not Found'; MSG_Error_Record = L + 'Error: Record too small (%s bytes)'; MSG_Error_IRecord = L + 'Error: Index Record too small (%s bytes)'; MSG_Error_IRecordS = L + 'Error: Index Record has the wrong Size'; MSG_Error_UID = L + 'Error: UID different to Filename (File: %s)'; MSG_Error_FindFile = 'Error: Canot find a Free UID'; MSG_Rem_Cat = 'INFO: Category Info found, Removing'; MSG_New_Cat = 'Set Category to "%s"'; IMPLEMENTATION END. plucker-1.8/conduit/source.w32/Copying.txt0100644000076400001440000004307607061651631017612 0ustar mickeusers GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, 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 Appendix: 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) 19yy 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., 675 Mass Ave, Cambridge, MA 02139, 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) 19yy 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. plucker-1.8/conduit/source.w32/Icons/0040755000076400001440000000000010052664545016507 5ustar mickeusersplucker-1.8/conduit/source.w32/Icons/pluckerpdb_b.tbmp0100644000076400001440000000022007123540555022015 0ustar mickeusers x eww8plucker-1.8/conduit/source.w32/Icons/pluckerpdb_s.tbmp0100644000076400001440000000004207123540555022040 0ustar mickeusers ( srp??plucker-1.8/conduit/source.w32/Icons/pluckerpdb_s.bmp0100644000076400001440000000014207123540555021655 0ustar mickeusersBMb>( $vyIzKzZ@vplucker-1.8/conduit/source.w32/DBTools.pas0100644000076400001440000001746207176107635017463 0ustar mickeusers{********************************************************************} { } { Program Name: DBTools Unit for Conduit.dpr } { Source Language: Delphi 3 } { Author: Dirk Heiser } { } {********************************************************************} { This unit is part of the Plucker conduit for Win32, see in } { Conduit.dpr for more Infos } { } {********************************************************************} UNIT DBTools; INTERFACE {$R Resource.res} USES Classes, SysUtils, Windows, ConstStrings; TYPE TDBHeader = ARRAY [ 0..77 ] OF Byte; TDBIndex = ARRAY [ 0..7 ] OF Byte; PROCEDURE MakeDBHeader ( DBName : STRING; DBVersion : LongInt; CTime, MTime, BTime : TDateTime; DBType : STRING; DBCreator : STRING; RecCount : LongInt; Flags : Word; AppInfo : LongInt; VAR Stream : TMemoryStream ); PROCEDURE MakeDBIndexEntry ( Pos : LongInt; Attrib : Byte; ID : LongInt; VAR Stream : TMemoryStream ); PROCEDURE MakePQAAppInfoBlock ( Icon,Name,Version : String; VAR Stream : TMemoryStream ); IMPLEMENTATION PROCEDURE MakeDBHeader ( DBName : STRING; DBVersion : LongInt; CTime, MTime, BTime : TDateTime; DBType : STRING; DBCreator : STRING; RecCount : LongInt; Flags : Word; AppInfo : LongInt; VAR Stream : TMemoryStream ); VAR TimePalm : Cardinal; Header : TDBHeader; I : Integer; BEGIN { Write: DBname [32 Char]******************************************} FOR I := 0 TO 31 DO Header [ I ] := 0; FOR I := 0 TO Length ( DBName ) - 1 DO Header [ I ] := Ord ( DBName [ I + 1 ] ); { Write: flags [Word]**********************************************} Header [ 32 ] := ( Flags AND $FF00 ) SHR 8; Header [ 33 ] := ( Flags AND $00FF ) SHR 0; { Write: version [Word]********************************************} Header [ 34 ] := ( DBVersion AND $FF00 ) SHR 8; Header [ 35 ] := ( DBVersion AND $00FF ) SHR 0; { Write: create_time [DWord]***************************************} TimePalm := ( ( Trunc ( CTime ) * 86400 ) - ( 1462 * 86400 ) ) + Trunc ( Frac ( CTime ) * 86400 ); Header [ 36 ] := ( TimePalm AND $FF000000 ) SHR 24; Header [ 37 ] := ( TimePalm AND $00FF0000 ) SHR 16; Header [ 38 ] := ( TimePalm AND $0000FF00 ) SHR 8; Header [ 39 ] := ( TimePalm AND $000000FF ) SHR 0; { Write: mod_time [DWord]******************************************} TimePalm := ( ( Trunc ( MTime ) * 86400 ) - ( 1462 * 86400 ) ) + Trunc ( Frac ( MTime ) * 86400 ); Header [ 40 ] := ( TimePalm AND $FF000000 ) SHR 24; Header [ 41 ] := ( TimePalm AND $00FF0000 ) SHR 16; Header [ 42 ] := ( TimePalm AND $0000FF00 ) SHR 8; Header [ 43 ] := ( TimePalm AND $000000FF ) SHR 0; { Write: backup_time [DWord]***************************************} TimePalm := ( ( Trunc ( BTime ) * 86400 ) - ( 1462 * 86400 ) ) + Trunc ( Frac ( BTime ) * 86400 ); Header [ 44 ] := ( TimePalm AND $FF000000 ) SHR 24; Header [ 45 ] := ( TimePalm AND $00FF0000 ) SHR 16; Header [ 46 ] := ( TimePalm AND $0000FF00 ) SHR 8; Header [ 47 ] := ( TimePalm AND $000000FF ) SHR 0; { Write: mod_num [DWord]*******************************************} FOR I := 48 TO 51 DO Header [ I ] := 0; { Write: app_info [DWord]******************************************} Header [ 52 ] := ( AppInfo AND $FF000000 ) SHR 24; Header [ 53 ] := ( AppInfo AND $00FF0000 ) SHR 16; Header [ 54 ] := ( AppInfo AND $0000FF00 ) SHR 8; Header [ 55 ] := ( AppInfo AND $000000FF ) SHR 0; { Write: sort_info [DWord]*****************************************} FOR I := 56 TO 59 DO Header [ I ] := 0; { Write: apptype [4 Char]******************************************} FOR I := 1 TO 4 DO Header [ I + 59 ] := Ord ( DBType [ I ] ); { Write: id [4 Char]***********************************************} FOR I := 1 TO 4 DO Header [ I + 63 ] := Ord ( DBCreator [ I ] ); { Write: unique_id_seed [DWord]; next_record_list [DWord]**********} FOR I := 68 TO 75 DO Header [ I ] := 0; { Write: num_records [DWord]***************************************} Header [ 76 ] := ( RecCount AND $FF00 ) SHR 8; Header [ 77 ] := RecCount AND $00FF; Stream.WriteBuffer ( Header, 78 ); END; PROCEDURE MakeDBIndexEntry ( Pos : LongInt; Attrib : Byte; ID : LongInt; VAR Stream : TMemoryStream ); VAR Index : TDBIndex; BEGIN { Write: Offset [DWord]**offset to record 0 from the **************} { beginning of the file*********************} Index [ 0 ] := ( Pos AND $FF000000 ) SHR 24; Index [ 1 ] := ( Pos AND $00FF0000 ) SHR 16; Index [ 2 ] := ( Pos AND $0000FF00 ) SHR 08; Index [ 3 ] := ( Pos AND $000000FF ) SHR 00; { Write: attrib [Byte]*********************************************} Index [ 4 ] := Attrib; { Write: unique ID [3 Bytes]***************************************} Index [ 5 ] := ( ID AND $FF0000 ) SHR 24; Index [ 6 ] := ( ID AND $00FF00 ) SHR 8; Index [ 7 ] := ( ID AND $0000FF ) SHR 0; Stream.WriteBuffer ( Index, 8 ); END; PROCEDURE MakePQAAppInfoBlock ( Icon,Name,Version : String; VAR Stream : TMemoryStream ); Var Temp : TMemoryStream; TempRes : TResourceStream; Dummy : Word; Ch : Byte; DummyStr : String; Function SwapWord(Input : Word ): Word; BEGIN Result := ((Input AND $00FF) SHL 08) + ((Input AND $FF00) SHR 08); END; Procedure WriteText(Input : String; Var Stream : TMemoryStream); Var Dummy : Word; Text : String; I : LongInt; Ch : Byte; Function SwapWord(Input : Word ): Word; BEGIN Result := ((Input AND $00FF) SHL 08) + ((Input AND $FF00) SHR 08); END; BEGIN Text := Input; Text:=Text+#0; If Frac(Length(Text)/2) <> 0 Then Text:=Text+#00; Dummy:=SwapWord(Trunc(Length(Text)/2)); Stream.WriteBuffer ( Dummy, 2 ); For I:=1 To Length(Text) Do Begin Ch := Ord(Text[I]); Stream.WriteBuffer ( Ch, 1 ); End; END; BEGIN Version:=Format(VersionStr,[Version]); Stream.Clear; DummyStr := PQASignature; Stream.WriteBuffer ( DummyStr[1], 1 ); Stream.WriteBuffer ( DummyStr[2], 1 ); Stream.WriteBuffer ( DummyStr[3], 1 ); Stream.WriteBuffer ( DummyStr[4], 1 ); Dummy:=SwapWord(PQAhdrVersion); Stream.WriteBuffer ( Dummy, 2 ); Dummy:=SwapWord(PQAencVersion); Stream.WriteBuffer ( Dummy, 2 ); WriteText(Version,Stream); WriteText(Name,Stream); If FileExists(Format(BigIconName,[Icon])) Then Begin Temp := TMemoryStream.Create; Temp.Clear; Temp.LoadFromFile(Format(BigIconName,[Icon])); Ch := 0; If Frac(Temp.Size/2) <> 0 Then Temp.WriteBuffer ( Ch, 1 ); Dummy:=SwapWord(Trunc(Temp.Size/2)); Stream.WriteBuffer ( Dummy, 2 ); Temp.SaveToStream ( Stream ); Temp.Free; End Else Begin TempRes := TResourceStream.CreateFromID(hinstance,BIGICON,RT_RCDATA); Ch := 0; If Frac(TempRes.Size/2) <> 0 Then TempRes.WriteBuffer ( Ch, 1 ); Dummy:=SwapWord(Trunc(TempRes.Size/2)); Stream.WriteBuffer ( Dummy, 2 ); TempRes.SaveToStream ( Stream ); TempRes.Free; End; If FileExists(Format(SmallIconName,[Icon])) Then Begin Temp := TMemoryStream.Create; Temp.Clear; Temp.LoadFromFile(Format(SmallIconName,[Icon])); Ch := 0; If Frac(Temp.Size/2) <> 0 Then Temp.WriteBuffer ( Ch, 1 ); Dummy:=SwapWord(Trunc(Temp.Size/2)); Stream.WriteBuffer ( Dummy, 2 ); Temp.SaveToStream ( Stream ); Temp.Free; End Else Begin TempRes := TResourceStream.CreateFromID(hinstance,SMALICON,RT_RCDATA); Ch := 0; If Frac(TempRes.Size/2) <> 0 Then TempRes.WriteBuffer ( Ch, 1 ); Dummy:=SwapWord(Trunc(TempRes.Size/2)); Stream.WriteBuffer ( Dummy, 2 ); TempRes.SaveToStream ( Stream ); TempRes.Free; End; END; END. plucker-1.8/conduit/source.w32/PalmUserData.pas.patch0100644000076400001440000000351607440263266021565 0ustar mickeusers--- PalmUserData.pas Sun Mar 03 00:13:52 2002 +++ PalmUserData.pas.new Sun Mar 03 00:16:52 2002 @@ -12,6 +12,8 @@ created by Mark Pierce (MakeDocW) -------------------------------------------------------- } +{$H+} + unit PalmUserData; interface @@ -23,7 +25,7 @@ PUsers = ^TPalmUsers; TPalmUsers = record - Magic: Word; + Magic: DWord; Name: Array[0..31] of Char; SubDir: Array[0..31] of Char; end; @@ -60,11 +62,10 @@ KeyLen: DWORD; KeyType: DWORD; begin - inherited; FUserList := nil; FUsers := 0; FLastUserNumber := 0; - FLastUserName := ''; + FLastUserName := ' '; HKeyUsr := 0; // First look for DeskTop 1.0 Entries... @@ -99,7 +100,7 @@ KeyType := REG_SZ; if (RegQueryValueEx(HKeyHnd, 'Path', nil, @KeyType, @FPalmDesktopPath, @KeyLen) = ERROR_SUCCESS) then - ReadUserData(); + ReadUserData; RegCloseKey(HKeyHnd); end; @@ -112,7 +113,6 @@ if FUserList <> nil then FreeMem(FUserList); FUsers := 0; - inherited; end; procedure TPalmUserData.ReadUserData; @@ -124,7 +124,7 @@ ListItemP: PUsers; FoundUser: Boolean; begin - AssignFile(UserData, FPalmDesktopPath + '\users.dat'); + AssignFile(UserData, StrPas(FPalmDesktopPath) + '\users.dat'); try Offset := 0; Reset(UserData, 1); @@ -148,7 +148,7 @@ // Read the user's magic number Seek(UserData, Offset); - BlockRead(UserData, ListItemP^.Magic, 2); + BlockRead(UserData, ListItemP^.Magic, 4); // Read the user's name Inc(Offset,4); @@ -269,7 +269,7 @@ begin HKeyUsr := 0; - InstallPath := GetPalmDesktopPath() + '\' + GetUserSubDir(User) + '\Install'; + InstallPath := GetPalmDesktopPath + '\' + GetUserSubDir(User) + '\Install'; CreateDirectory(PChar(InstallPath), nil); InstallPath := InstallPath + '\' + ExtractFileName(FileName); plucker-1.8/conduit/source.w32/PalmUserData/0040755000076400001440000000000010052664545017756 5ustar mickeusersplucker-1.8/conduit/source.w32/PalmUserData/PalmUserData.HLP0100644000076400001440000003416207115517046022647 0ustar mickeusers?_r8():,.19972000::=;aAddanandapplicationArtauto-installA I 0ComboBoxBooleanCclass@usecodmco;ructorCopyrightcPCountCreatec dDahmdDelphiDe`scrip ktoptroydT dire\yEnabled fileFName sfollowingfor`freeFsfromfuncgetGetLastUserNumberbsPal Path-)Magic @q@SubDirhasHishttpinindexInm]!tialized`AgAedeA{!nceIntegdSD@sItemIZlAlmostnnotn objoverrid1CR>dv& d# $>#*%%@%/dO2 2J H&D2#ClassV@/@(R.pbeen+tested@#under12341@5?D3versio@n2.0L+higherKT+publicCfunct)s:3* $B.@08;>#O00 0F28`HF<6(*pPp`d s6",*D5f5@6(b*k!kPh ;2,*4dj 0;0b*mM`Ml:@u ;2*XuQn:ACT*hR P"&z% B2Tv} !EF("http://palm.dahm.com.",`',P1)' ' m@ailto:'@'P&pRo2 < /Webt>./+E-#S?#BasF3loosely7 ++(: Mark+Pierce;MakeDocW)4z14*  (v#hk,k&k\=+ & mtGu$ To8v[appas .@`3projectlz/ .Dk  Cop yaNNpas'xJ e@cUSES*#7*=& LTjEPB8@ ;-&(6Z 80t ype$A$\3@ 6H @ Vvar ? *)p "5@`%*\))':&)*SLS1;(%/)%@O%*O)*%y`)]-O)81Don't forget to clean up when you're done5B7y @/*@Z*7)* a)F.7+\7D2SAnFil*l̍'*a0)JH *4t5! 3s,#fwsxCaBvNable43desktop;AQitemE|PT8@#tFea noaq8 ),A@;disud* )HF"i Ԁ Pi~E#Yx 3#? &``c8?f <>O#beginO LSTrue#  ear+ V,6t3BcGetNumUs -1 _1Ihs@l63))I@dX0endOelset@#Fa n,  +TQ*, I ++:I$ - *-5tQeDX@3InstaN+I *B =H \ , =4+#AfBt ;crengt`*line #F N  Stransferr> +durAnext3HotSyn oper?'y, +j;MJ\ . ,”2ofs,ePathAnd Name4 1]R  1 ]r( 1 @# &ʜ&7 h $ 2^;2/9/2000 1.21 S t,Pp" M J^;autoiP/SAhBSReJmat,8h 8$4Π;12/11/97@1p8 @=I3Remov>sef al3uG itsEsesPKdesrBsizKexecut5 #about130k88$%;15p0J]2 4=!' Iia8l R x.041* 72zZ]0S 6SO(:3?;AlthoughI4 "3to{yX#alo@+sou, ).mTay&Jvny*gramivateK m s9canZ+X";5 vid}< t+Pnoti% v Phelp" M'5'[wistribupV/  it 3a#?\mHust03X0s^L07&A M.Lû #Wh laQ NYUSA-2 i1X i&7# i1 0Q>1P% 2/@B@ JTR It;requiresΌ8 #ordwo 2F1U IFq8+q@& 0rn-N /yF8m83qx=KBC truc efSiu3s:data+bew U red.083s8(q(%oqB&N%ӯGO(% {.ˀ/  2N1oX  AF(#q}!F> AD V|A]T|A{u" A;Destroys.HF ;+; B? Do&F;directlyv33InsteadZZ;verifies;nilon:#callsFoF\(+TBrush#T Font,TPen3objqNwere:TVX#.@-P,Kproper*t~Z0mepmory6 s2?A1I?AgAAd(" AgA# 8D#Nd?AA< F(@y 01xCD!`d #A!B?$d b220Z2 gA&B1&BNBBf(ANB# 8fu&BB<t5 n0fڠf@&`)2NBB1 BCCh(#BC#(FhBC<!1Ph ȮqhA+2 CC1 CCDj(CC#:jCD<EީV!QQjjB/g!2 CD1 DDEl(DD#lDE<݃Ճ# l@ρl~C-2 DE1 EEfFn(EE@#t<tnEfF<tttt$nnoD+withinBJ!"2 EF1 FFG(fFF@#qXFG<XXqq"P"Wux~"PB;filenhame%NL1FG1UGG$GGP#rrFr/1G1hTimes New RomanArialCourier New A8 X I* R/&;)F24Copyright InformationCreateDestroyGetLastUserNumber GetNumUsersGetPalmDesktopPathGetUserMagicGetUserNameGetUserSubDir InstallUser$Introduction(Revision History,TPalmUserData0Using TPalmUserData4/&;)LzIntroductionRUsing TPalmUserData* Revision History Copyright Information TPalmUserDataX CreateIDestroyGetLastUserNumberGetNumUsersGetPalmDesktopPathGetUserMagicGetUserNameGetUserSubDirInstallUser/&;)L4R* X I/&;)L4+ C2 f8\jY\僭X `[RZ.I$92%5* D6?4}kLClP.$$h$ |}plucker-1.8/conduit/source.w32/PalmUserData/PalmUserData.cnt0100644000076400001440000000072207115517046023003 0ustar mickeusers:Base PalmUserData.hlp :Title TPalmUserData 1 Overview 2 Introduction=Introduction 2 Using TPalmUserData=Using 2 Revision History=History 2 Copyright Information=Copyright 1 TPalmUserData 2 TPalmUserData=TPalmUserData 2 Create=Create 2 Destroy=Destroy 2 GetLastUserNumber=GetlastUserNumber 2 GetNumUsers=GetNumUsers 2 GetPalmDesktopPath=GetPalmDesktopPath 2 GetUserMagic=GetUserMagic 2 GetUserName=GetUserName 2 GetUserSubDir=GetUserSubDir 2 InstallUser=InstallUser plucker-1.8/conduit/source.w32/PalmUserData/PalmUserData.pas0100644000076400001440000001600707115517046023005 0ustar mickeusers{ -------------------------------------------------------- TPalmUserData Class for Delphi A Delphi class to auto-install Palm .PDB and .PRC files. Copyright 1997, 2000 by Art Dahm All rights reserved Web: http://palm.dahm.com E-mail: palm@dahm.com -------------------------------------------------------- Based loosely on the C++ TPalmUserData class created by Mark Pierce (MakeDocW) -------------------------------------------------------- } unit PalmUserData; interface uses Windows, SysUtils; type PUsers = ^TPalmUsers; TPalmUsers = record Magic: Word; Name: Array[0..31] of Char; SubDir: Array[0..31] of Char; end; TPalmUserData = class private FUsers: Byte; FLastUserNumber: Integer; FPalmDesktopPath: Array[0..255] of Char; FLastUserName: Array[0..31] of Char; FUserList: Pointer; procedure ReadUserData; public constructor Create; destructor Destroy; override; function GetLastUserNumber: Integer; function GetNumUsers: Integer; function GetPalmDesktopPath: String; function GetUserMagic(User: Integer): Integer; function GetUserName(User: Integer): String; function GetUserSubDir(User: Integer): String; function InstallUser(User: Integer; FileName: String): Boolean; end; const SizeOfTPalmUsers = sizeof(TPalmUsers); implementation constructor TPalmUserData.Create; var HKeyHnd: HKEY; HKeyUsr: HKEY; KeyLen: DWORD; KeyType: DWORD; begin inherited; FUserList := nil; FUsers := 0; FLastUserNumber := 0; FLastUserName := ''; HKeyUsr := 0; // First look for DeskTop 1.0 Entries... if (RegOpenKey(HKEY_CURRENT_USER, 'Software\U.S. Robotics', HKeyUsr) <> ERROR_SUCCESS) then begin // Not found, look for DeskTop 2.0 entry.... if (RegOpenKey(HKEY_CURRENT_USER, 'Software\Palm Computing', HKeyUsr) <> ERROR_SUCCESS) then begin MessageBox(0, 'The Palm Desktop software is not correctly installed.', 'Install', MB_ICONSTOP or MB_OK); HKeyUsr := 0; end; end; if (HKeyUsr <> 0) then begin if (RegOpenKey(HKeyUsr, 'Pilot Desktop\Preferences', HKeyHnd) = ERROR_SUCCESS) then begin KeyLen := sizeof(FLastUserName); KeyType := REG_SZ; RegQueryValueEx(HKeyHnd, 'LastUserName', nil, @KeyType, @FLastUserName, @KeyLen); RegCloseKey(HKeyHnd); end; if (RegOpenKey(HKeyUsr, 'Pilot Desktop\Core', HKeyHnd) = ERROR_SUCCESS) then begin KeyLen := sizeof(FPalmDesktopPath); KeyType := REG_SZ; if (RegQueryValueEx(HKeyHnd, 'Path', nil, @KeyType, @FPalmDesktopPath, @KeyLen) = ERROR_SUCCESS) then ReadUserData(); RegCloseKey(HKeyHnd); end; RegCloseKey(HKeyUsr); end; end; destructor TPalmUserData.Destroy; begin if FUserList <> nil then FreeMem(FUserList); FUsers := 0; inherited; end; procedure TPalmUserData.ReadUserData; var UserData: file; StringLen: Byte; Offset: LongInt; Count: Integer; ListItemP: PUsers; FoundUser: Boolean; begin AssignFile(UserData, FPalmDesktopPath + '\users.dat'); try Offset := 0; Reset(UserData, 1); Seek(UserData, Offset); BlockRead(UserData, FUsers, 1); if (FUsers > 0) then begin GetMem(FUserList, SizeOfTPalmUsers * FUsers); if (FUserList <> nil) then begin // Offset of first user entry Offset := 13; ListItemP := PUsers(FUserList); for Count := 0 to FUsers-1 do begin StringLen := 0; ListItemP^.Magic := 0; // Read the user's magic number Seek(UserData, Offset); BlockRead(UserData, ListItemP^.Magic, 2); // Read the user's name Inc(Offset,4); Seek(UserData, Offset); BlockRead(UserData, StringLen, 1); BlockRead(UserData, ListItemP^.Name, StringLen); ListItemP^.Name[StringLen] := Chr(0); Offset := Offset + (StringLen + 1); // Check if this was the last user if (StrComp(PChar(@(FLastUserName[0])), PChar(@(ListItemP^.Name[0]))) = 0) then fLastUserNumber := Count; // Read the user's sub-dir BlockRead(UserData, StringLen, 1); BlockRead(UserData, ListItemP^.SubDir, StringLen); ListItemP^.SubDir[StringLen] := Chr(0); Offset := Offset + (StringLen + 1); // Read the flag byte BlockRead(UserData, StringLen, 1); // Set offset of next user entry if Count < (FUsers-1) then begin Inc(Offset, 1); FoundUser := False; while not FoundUser do begin Inc(Offset, 1); BlockRead(UserData, StringLen, 1); if StringLen = 1 then begin Inc(Offset, 1); BlockRead(UserData, StringLen, 1); if StringLen = 128 then FoundUser := True; end; end; end; Inc(ListItemP); end; end; end; finally CloseFile(UserData); end; end; function TPalmUserData.GetNumUsers: Integer; begin Result := FUsers; end; function TPalmUserData.GetLastUserNumber: Integer; begin Result := fLastUserNumber; end; function TPalmUserData.GetPalmDesktopPath: String; begin Result := FPalmDesktopPath; end; function TPalmUserData.GetUserMagic(User: Integer): Integer; var UsersP: PUsers; begin if ((FUserList <> nil) and (User >= 0) and (User < FUsers)) then begin UsersP := FUserList; Inc(UsersP, User); Result := UsersP^.Magic; end else Result := 0; end; function TPalmUserData.GetUserName(User: Integer): String; var UsersP: PUsers; begin if ((FUserList <> nil) and (User >= 0) and (User < FUsers)) then begin UsersP := FUserList; Inc(UsersP, User); Result := UsersP^.Name; end else Result := ''; end; function TPalmUserData.GetUserSubDir(User: Integer): String; var UsersP: PUsers; begin if ((FUserList <> nil) and (User >= 0) and (User < FUsers)) then begin UsersP := FUserList; Inc(UsersP, User); Result := UsersP^.SubDir; end else Result := ''; end; function TPalmUserData.InstallUser(User: Integer; FileName: String): Boolean; var HKeyHnd: HKEY; HKeyUsr: HKEY; InstallPath: String; Param: String; KeyValue: Integer; begin Result := False; if (GetNumUsers > 0) then begin HKeyUsr := 0; InstallPath := GetPalmDesktopPath() + '\' + GetUserSubDir(User) + '\Install'; CreateDirectory(PChar(InstallPath), nil); InstallPath := InstallPath + '\' + ExtractFileName(FileName); if CopyFile(PChar(FileName), PChar(InstallPath), False) then begin // First look for DeskTop 1.0 Entries... if (RegOpenKey(HKEY_CURRENT_USER, 'Software\U.S. Robotics', HKeyUsr) <> ERROR_SUCCESS) then begin // Not found, look for DeskTop 2.0 entry.... if (RegOpenKey(HKEY_CURRENT_USER, 'Software\Palm Computing', HKeyUsr) <> ERROR_SUCCESS) then begin MessageBox(0, 'The Palm Desktop software is not correctly installed.', 'Install', MB_ICONSTOP or MB_OK); HKeyUsr := 0; end; end; if (HKeyUsr <> 0) then begin if RegOpenKey(HKeyUsr, 'Pilot Desktop\HotSync Manager', HKeyHnd) = ERROR_SUCCESS then begin KeyValue := 1; Param := 'Install' + IntToStr(GetUserMagic(User)); RegSetValueEx(HKeyHnd, PChar(Param), 0, REG_DWORD, @KeyValue, sizeof(DWORD)); RegCloseKey(HKeyHnd); Result := True; end; RegCloseKey(HKeyUsr); end; end; end; end; end. plucker-1.8/conduit/source.w32/PalmUserData/PalmUserData.txt0100644000076400001440000000717307115517046023045 0ustar mickeusers -------------------------------------------------------- TPalmUserData Class for Delphi A Delphi class to auto-install Palm .PDB and .PRC files. Copyright 1997-2000 by Art Dahm All rights reserved Web: http://palm.dahm.com E-mail: palm@dahm.com -------------------------------------------------------- Based loosely on the C++ TPalmUserData class created by Mark Pierce (MakeDocW) -------------------------------------------------------- CONTENTS 1. General 2. Using this class 3. Support, feedback and bugs 4. Revision History 1. General ---------- This class has been tested under Delphi 2, 3, 4 and 5 with the Palm Desktop version 2.0 and higher. TPalmUserData has the following public functions: constructor Create; destructor Destroy; override; function GetLastUserNumber: Integer; function GetNumUsers: Integer; function GetPalmDesktopPath: String; function GetUserMagic(User: Integer): Integer; function GetUserName(User: Integer): String; function GetUserSubDir(User: Integer): String; function InstallUser(User: Integer; FileName: String): Boolean; 2. Using this unit ------------------ To use this class in your applications: A. Add the 'PalmUserData' unit to your project ------------------------------------------- Copy the file 'PalmUserData.pas' into your project's directory. Add 'PalmUserData' to your project's USES clause. B. Create an instance of TPalmUserData ------------------------------------------- Create a variable of type TPalmUserData: var UserData: TPalmUserData; Create an instance if the variable: UserData := TPalmUserData.Create; Don't forget to clean up when you're done: UserData.Free; C. Fill a TComboBox with the list of users ------------------------------------------- This section of code fills a TComboBox with the list of users available on the Palm desktop. The selected item in the TComboBox is initialized to the most recent user to use the Palm Desktop. If there are no users (the Palm Desktop is not installed), the TComboBox is disabled. if UserData.GetNumUsers <> 0 then begin AutoInstallComboBox.Enabled := True; AutoInstallComboBox.Clear; for Count := 0 to UserData.GetNumUsers-1 do AutoInstallComboBox.Items.Add(UserData.GetUserName(Count)); AutoInstallComboBox.ItemIndex := UserData.GetLastUserNumber; end else AutoInstallComboBox.Enabled := False; D. Install the .PRC or .PDB file ------------------------------------------- After creating a .PRC or .PDB file, the following line of code will auto-install the file. The file will be transferred during the next HotSync operation. UserData.InstallUser(AutoInstallComboBox.ItemIndex, FilePathAndName); 3. Support, feedback and bugs ----------------------------- I do not "oficially" provide support for this software. However, if you have any questions about it, please feel free to write to me at: palm@dahm.com I will try to answer your questions promptly. If you have any suggestions for improvement, please let me know also, as I will be more than happy to hear your opinions! If you find a bug in this class, please let me know by sending a description of the bug to: palm@dahm.com I will correct all reported bugs as soon as possible. 4. Revision History ------------------- 2/9/2000: Version 1.2 - Renamed file to PalmUserData.pas from autoinst.pas - Renamed unit to PalmUserData from AutoInstall - Reformatted code 12/11/97: Version 1.1 - Removed several useless units from the Uses clause, potentially decreasing the size of the executable by about 130k. 11/15/97: Version 1.0 - Initial Release. plucker-1.8/conduit/source.w32/make.bat0100755000076400001440000000215707440263266017050 0ustar mickeusers@ECHO OFF SET COMPILE_WITH=VP IF %COMPILE_WITH% == VP GOTO VP IF %COMPILE_WITH% == DELPHI GOTO DELPHI GOTO END :VP Set RC="C:\Programme\Delphi 3\Delphi 3\bin\brcc32.exe" Set VP=C:\Vp21\ Set PATCH=Patch.exe Copy .\PalmUserData\PalmUserData.pas .\PalmUserData.pas > nul %PATCH% -i PalmUserData.pas.Patch ECHO. IF NOT EXIST "Resource.RES" %RC% Resource.rc ECHO. %VP%Bin.w32\Vpc.exe -CW -B -E.. -$PMTYPE:VIO Conduit.dpr -U%VP%Units.w32 -L%VP%Units.w32;%VP%Lib.w32 -R%VP%Res.w32 ECHO. Del PalmUserData.pas > nul Del Conduit.lnk > nul Del Conduit.obj > nul Del ConstStrings.lib > nul Del ConstStrings.vpi > nul Del DBTools.lib > nul Del DBTools.vpi > nul Del PalmConst.vpi > nul Del PalmUserData.lib > nul Del PalmUserData.vpi > nul Del Tools.lib > nul Del Tools.vpi > nul ECHO. GOTO END :DELPHI Set delphi="C:\Programme\Delphi 3\Delphi 3\bin\" Set PATCH=Patch.exe Copy .\PalmUserData\PalmUserData.pas .\PalmUserData.pas > nul %PATCH% -i PalmUserData.pas.fix.Patch ECHO. IF NOT EXIST "Resource.RES" %delphi%brcc32.exe Resource.rc ECHO. %delphi%dcc32.exe Conduit.dpr -N..\ -E..\ ECHO. Del PalmUserData.pas > nul ECHO. GOTO END :END plucker-1.8/conduit/source.w32/Readme.txt0100644000076400001440000000113307176107635017372 0ustar mickeusersTo Compile this Program setup and use "make.bat". I use Virtual Pascal Version 2.1.231 (a free Pascal Compiler) to compile this program. See http://www.vpascal.com for more infos about Virtual Pascal. This source compile also with Delphi 3 or newer. For infos about the PRC/PDB File Format visit: The Pilot Record Database Format: http://www.developer.com/directories/pages/roadcoders/pdb.html Please notice that the TPalmUserData Class used by the Programm is Copyrighted by Art Dahm, visit his web site for the latest Version and more Infos: Delphi TPalmUserData Class: http://palm.dahm.com/ plucker-1.8/conduit/source.w32/PalmConst.pas0100644000076400001440000001344207176107635020047 0ustar mickeusers{********************************************************************} { } { Some Const used for Palm stuff } { } {********************************************************************} UNIT PalmConst; INTERFACE CONST {********************************************************************} { } { Some Const used for Palm stuff, known from the Docs } { } {********************************************************************} mydmValidDBNameChars = [' '..'~'];// dmDBNameLength Maximum length of a databases name. // Currently, this is 32 bytes, which include the // null terminator. Note that database names must // use only 7-bit ASCII characters (0x20 through // 0x7E). mydmMaxRecSize = 65505; // Maximum Size of a DB Record in Byte. mydmNullTime = 1462; // Delphi TDateTime Value to Give a Palm null Time. {********************************************************************} { } { The following are from "DataMgr.h" SDK 3.5 } { } {********************************************************************} //************************************************************ //* Category equates //************************************************************ dmRecAttrCategoryMask = $0F; // mask for category # dmRecNumCategories = 16; // number of categories dmCategoryLength = 16; // 15 chars + 1 null terminator dmAllCategories = $ff; dmUnfiledCategory = 0; dmMaxRecordIndex = $ffff; // Record Attributes dmRecAttrDelete = $80; // delete this record next sync dmRecAttrDirty = $40; // archive this record next sync dmRecAttrBusy = $20; // record currently in use dmRecAttrSecret = $10; // "secret" record - password protected //************************************************************ //* Database Header equates //************************************************************ dmDBNameLength = 32; // 31 chars + 1 null terminator // Attributes of a Database dmHdrAttrResDB = $0001; // Resource database dmHdrAttrReadOnly = $0002; // Read Only database dmHdrAttrAppInfoDirty = $0004; // Set if Application Info block is dirty // Optionally supported by an App's conduit dmHdrAttrBackup = $0008; // Set if database should be backed up to PC if // no app-specific synchronization conduit has // been supplied. dmHdrAttrOKToInstallNewer = $0010; // This tells the backup conduit that it's OK // for it to install a newer version of this database // with a different name if the current database is // open. This mechanism is used to update the // Graffiti Shortcuts database, for example. dmHdrAttrResetAfterInstall = $0020; // Device requires a reset after this database is // installed. dmHdrAttrCopyPrevention = $0040; // This database should not be copied to dmHdrAttrStream = $0080; // This database is used for file stream implementation. dmHdrAttrHidden = $0100; // This database should generally be hidden from view // used to hide some apps from the main view of the // launcher for example. // For data (non-resource) databases, this hides the record // count within the launcher info screen. dmHdrAttrLaunchableData = $0200; // This data database (not applicable for executables) // can be "launched" by passing it's name to it's owner // app ('appl' database with same creator) using // the sysAppLaunchCmdOpenNamedDB action code. dmHdrAttrOpen = $8000; // Database not closed properly //************************************************************ //* Unique ID equates //************************************************************ dmRecordIDReservedRange = 1; // The range of upper bits in the database's // uniqueIDSeed from 0 to this number are // reserved and not randomly picked when a // database is created. dmDefaultRecordsID = 0; // Records in a default database are copied // with their uniqueIDSeeds set in this range. dmUnusedRecordID = 0; // Record ID not allowed on the device IMPLEMENTATION END. plucker-1.8/conduit/source.w32/PalmUserData.pas.fix.patch0100644000076400001440000000077107440263266022352 0ustar mickeusers--- PalmUserData.pas Sun Mar 03 00:13:52 2002 +++ PalmUserData.pas.new Wed Feb 20 23:42:36 2002 @@ -23,7 +23,7 @@ PUsers = ^TPalmUsers; TPalmUsers = record - Magic: Word; + Magic: DWord; Name: Array[0..31] of Char; SubDir: Array[0..31] of Char; end; @@ -148,7 +148,7 @@ // Read the user's magic number Seek(UserData, Offset); - BlockRead(UserData, ListItemP^.Magic, 2); + BlockRead(UserData, ListItemP^.Magic, 4); // Read the user's name Inc(Offset,4); plucker-1.8/conduit/source.w32/Resource.RES0100644000076400001440000000206407443507021017570 0ustar mickeusers 0 x eww8" 0  } { } {********************************************************************} { This unit is part of the Plucker conduit for Win32, see in } { Conduit.dpr for more Infos } { } {********************************************************************} UNIT Tools; INTERFACE USES Classes,SysUtils, PalmUserData, ConstStrings, PalmConst; TYPE TConfig = RECORD User : STRING; Plucker_Dir : STRING; Cache : STRING; DBID : STRING; DBName : STRING; FName : STRING; Fix : Boolean; DBVersion : Integer; Install : STRING; Verbose : Integer; HFlags : Word; AppInfo : String; Category : String; END; FUNCTION CheckCommandLine ( VAR Config : TConfig ) : Boolean; PROCEDURE InstallFile ( FileName, Users : STRING; Verbose: Integer ); Function GetFileList ( SearchFor : String;Var Files : TStringList ):Integer; FUNCTION GetCT ( Data : PByteArray; UID : LongInt ):Integer; FUNCTION GetRecName ( UID : LongInt; Req_Name_List,Req_UID_List : TStringList ):String; FUNCTION GetReq ( FileName : String; Var Req_NameID_List, Req_Name_List,Req_UID_List : TStringList ):Integer; PROCEDURE CheckUID ( Data : PByteArray; UID : LongInt ); Procedure WriteCategoryRec(Verbosity : Integer; Category, CacheDir : String); IMPLEMENTATION PROCEDURE CheckUID ( Data : PByteArray; UID : LongInt ); BEGIN If UID <> (Data^[0] SHL 8) OR Data^[1] Then BEGIN WriteLN ( Format ( MSG_Error_UID, [ IntToStr(UID) ] ) ); Halt ( 1 ); END; END; FUNCTION GetReq ( FileName : String; Var Req_NameID_List,Req_Name_List,Req_UID_List : TStringList ):Integer; VAR TempData : PByteArray; Input : FILE; I : LongInt; Function ToLongInt(H,L:Byte):LongInt; BEGIN RESULT := (H SHL 8) OR L; END; BEGIN AssignFile ( Input, FileName); FileMode := 0; Reset ( Input, 1 ); GetMem ( TempData, FileSize ( Input ) ); BlockRead ( Input, TempData^, FileSize ( Input ) ); CloseFile(Input); If Sizeof(TempData^) < DBMinIRecSize Then BEGIN WriteLN ( Format ( MSG_Error_IRecord, [ IntToStr(Sizeof(TempData^)) ] ) ); Halt ( 1 ); END; If Sizeof(TempData^) < ((ToLongInt(TempData^[6-2],TempData^[6-1])*4)+DBMinIRecSize) Then BEGIN WriteLN ( MSG_Error_IRecordS ); Halt ( 1 ); END; Req_NameID_List.Clear; Req_Name_List.Clear; Req_UID_List.Clear; Req_NameID_List.Add(IntToStr(low(RESERVED_NAMES)+1)); Req_Name_List.Add(RESERVED_NAMES[low(RESERVED_NAMES)+1]); Req_UID_List.Add(IntToStr(Index_Record)); For I:=0 To ToLongInt(TempData^[6-2],TempData^[6-1])-1 DO BEGIN IF ToLongInt(TempData^[6+(I*4)+0],TempData^[6+(I*4)+1]) > High(RESERVED_NAMES) Then Req_NameID_List.Add(IntToStr(low(RESERVED_NAMES))) ELSE Req_NameID_List.Add(IntToStr(ToLongInt(TempData^[6+(I*4)+0],TempData^[6+(I*4)+1]))); IF ToLongInt(TempData^[6+(I*4)+0],TempData^[6+(I*4)+1]) > High(RESERVED_NAMES) Then Req_Name_List.Add(RESERVED_NAMES[low(RESERVED_NAMES)]) ELSE Req_Name_List.Add(RESERVED_NAMES[ToLongInt(TempData^[6+(I*4)+0],TempData^[6+(I*4)+1])]); Req_UID_List.Add(IntToStr(ToLongInt(TempData^[6+(I*4)+2],TempData^[6+(I*4)+3]))); END; IF ToLongInt(TempData^[2],TempData^[3]) > High(CompressionTypes) Then Result := Low(CompressionTypes) ELSE Result := ToLongInt(TempData^[2],TempData^[3]); END; FUNCTION GetRecName ( UID : LongInt; Req_Name_List,Req_UID_List : TStringList ):String; VAR I : LongInt; Is_Special : LongInt; BEGIN Is_Special := -1; For I:=0 To Req_UID_List.Count-1 Do If Req_UID_List[I] = IntToStr(UID) Then IS_Special := I; If Is_Special = -1 Then Result := RecName ELSE Result := Req_Name_List[IS_Special]; END; FUNCTION GetCT ( Data : PByteArray; UID : LongInt ):Integer; BEGIN IF UID <> Index_Record THEN BEGIN IF Sizeof(Data^) < DBMinRecSize Then BEGIN WriteLN ( Format ( MSG_Error_Record, [ IntToStr(Sizeof(Data^)) ] ) ); Halt ( 1 ); END ELSE BEGIN Result:=Data^[DBCTPOS-2]; If Result > High(CT) Then Result:= Low(CT) END; END ELSE Result:= Low(CT)+1; END; FUNCTION CheckCommandLine ( VAR Config : TConfig ) : Boolean; VAR I, II : Integer; OK, AllOK : Boolean; Para : STRING; BEGIN Config.DBVersion := StrToInt ( DBVersion ); Config.Fix := False; Config.HFlags := $0000; Config.Verbose := StrToInt(Verbose); Config.AppInfo := Empty; Config.Category := Empty; AllOK := True; IF ParamCount > 0 THEN BEGIN FOR I := 1 TO ParamCount DO BEGIN OK := False; FOR II := 1 TO Switchcount DO BEGIN IF length ( ParamStr ( I ) ) >= length ( Switches [ II ] ) THEN IF Lowercase ( copy ( ParamStr ( I ), 1, length ( Switches [ II ] ) ) ) = Switches [ II ] THEN BEGIN Para := copy ( ParamStr ( I ), length ( Switches [ II ] ) + 1, Length ( ParamStr ( I ) ) - length ( Switches [ II ] ) ); CASE II OF 1 : Config.User := Para; 2 : Config.Plucker_Dir := Para; 3 : Config.Cache := Para; 4 : Config.DBID := Para; 5 : Config.DBName := Para; 6 : Config.FName := Para; 7 : IF length ( Para ) < 1 THEN Config.Fix := True; 8 : IF length ( Para ) > 0 THEN try Config.DBVersion := StrToInt ( Para ); EXCEPT AllOK := False; END; 9 : IF length ( Para ) > 0 THEN Config.Install := Para; 10: IF length ( Para ) > 0 THEN TRY Config.Verbose := StrToInt ( Para ); EXCEPT AllOK := False; END; 11: IF length ( Para ) < 1 THEN Config.HFlags := Config.HFlags OR dmHdrAttrCopyPrevention; 12: IF length ( Para ) < 1 THEN Config.HFlags := Config.HFlags OR dmHdrAttrBackup; 13: IF length ( Para ) < 1 THEN Config.HFlags := Config.HFlags OR dmHdrAttrLaunchableData; 14: IF length ( Para ) < 1 THEN Config.AppInfo := STR_NonIcon; 15: IF length ( Para ) > 0 THEN Config.AppInfo := Para; 16: IF length ( Para ) > 0 THEN Config.Category := Para; END; OK := True; END; END; IF Ok = False THEN AllOK := False; END; IF length ( Config.Plucker_Dir ) < 1 THEN IF length ( Config.Install ) < 1 THEN AllOK := False; IF ( ( length ( Config.User ) < 1 ) AND ( length ( Config.Install ) > 0 ) ) THEN AllOK := False; IF length ( Config.Plucker_Dir ) > 0 THEN IF Copy ( Config.Plucker_Dir, length ( Config.Plucker_Dir ), 1 ) <> PathSep THEN Config.Plucker_Dir := Config.Plucker_Dir + PathSep; IF length ( Config.Cache ) = 0 THEN Config.Cache := CacheDir ELSE IF Copy ( Config.Cache, length ( Config.Cache ), 1 ) <> PathSep THEN Config.Cache := Config.Cache + PathSep; IF length ( Config.DBID ) <> 4 THEN Config.DBID := DBCreator; IF length ( Config.DBName ) = 0 THEN Config.DBName := DBName; If Length(Config.DBName) > (dmDBNameLength-1-DBReservedLength) Then Config.DBName := Copy(Config.DBName,1,(dmDBNameLength-1-DBReservedLength)); For I:=1 To Length(Config.DBName) Do If NOT (Config.DBName[I] in mydmValidDBNameChars) Then Config.DBName[I] := DBNameSubstitute; IF length ( Config.FName ) = 0 THEN Config.FName := DBFileName; If Length(Config.Plucker_Dir) > 0 Then Config.Plucker_Dir := ExpandFileName(Config.Plucker_Dir); END ELSE AllOK := False; result := AllOK; END; FUNCTION GetFirstUser(Var Users: String):String; Const SEPP = ';'; Begin Users:=Trim(Users); If Users[1]=SEPP Then Repeat Users:=Copy(Users,2,Length(Users)-1); Until Users[1]<>SEPP; If Users[Length(Users)]=SEPP Then Repeat Users:=Copy(Users,1,Length(Users)-1); Until Users[Length(Users)]<>SEPP; If Pos(SEPP, Users)=0 Then Begin Result:=Trim(Users); Users:=''; End Else Begin Result:=Trim(Copy(Users,1,Pos(SEPP,Users)-1)); Users:=Copy(Users,Pos(SEPP,Users)+1,Length(Users)-Pos(SEPP,Users)); End; End; PROCEDURE InstallFile ( FileName, Users : STRING; Verbose: Integer ); VAR UserData : TPalmUserData; Found : Longint; I : Longint; User : String; BEGIN User:=''; Repeat User:=GetFirstUser(Users); IF (length ( User ) > 0) AND (length ( FileName ) > 0) THEN IF FileExists ( FileName ) THEN TRY If Verbose > 0 Then Write ( Format ( MSG_Installing, [ ExtractFileName ( FileName ), User ] ) ); UserData := TPalmUserData.Create; Found := 0; FOR I := 0 TO UserData.GetNumUsers - 1 DO IF User = UserData.GetUserName ( I ) THEN BEGIN UserData.InstallUser ( I, FileName ); If Verbose > 0 THEN WriteLn ( MSG_Done ); Found := 1; END; IF Found = 0 THEN BEGIN If Verbose = 0 Then Write ( Format ( MSG_Installing, [ ExtractFileName ( FileName ), User ] ) ); WriteLN ( Format ( MSG_Error_UserNF, [ User ] ) ); END; UserData.Free; If Verbose > 0 Then Writeln; EXCEPT If Verbose = 0 Then Write ( Format ( MSG_Installing, [ ExtractFileName ( FileName ), User ] ) ); WriteLN ( Format ( MSG_Error_User, [ User ] ) ); If Verbose > 0 Then Writeln; Halt ( 1 ); END ELSE BEGIN If Verbose = 0 Then Write ( Format ( MSG_Installing, [ ExtractFileName ( FileName ), User ] ) ); WriteLN ( Format ( MSG_Error_FNF, [ ExtractFileName ( FileName ) ] ) ); If Verbose > 0 Then Writeln; Halt ( 1 ); END; Until length ( User ) = 0; END; Function GetFileList ( SearchFor : String;Var Files : TStringList ):Integer; Var SearchRec : TSearchRec; Found : Longint; BIndex_Record : Boolean; Function IsFileName(FileName : String):Boolean; Var I : LongInt; BEGIN Result:=True; For I:=1 To Length(FileName) Do If NOT (FileName[I] IN ValidChars) Then Result := False; END; Procedure SortFiles(FileName : String; Var Files : TStringList ); Var I : LongInt; Begin If Files.Count > 1 Then If StrToInt(FileName) > StrToInt(Files[Files.Count-1]) Then Files.Add(FileName) ELSE If StrToInt(FileName) < StrToInt(Files[0]) Then Files.Insert(0,FileName) ELSE BEGIN I:=-1; Repeat I:=I+1; Until ((StrToInt(FileName) >= StrToInt(Files[I])) AND (StrToInt(FileName) < StrToInt(Files[I+1]))) OR (I=Files.Count-2); Files.Insert(I+1,FileName); END Else If Files.Count = 0 Then Files.Add(FileName) ELSE If StrToInt(FileName) > StrToInt(Files[0]) Then Files.Add(FileName) Else Files.Insert(0,FileName); END; BEGIN BIndex_Record := False; Files.Clear; Found := FindFirst ( SearchFor, $27, SearchRec ); WHILE Found = 0 DO BEGIN If IsFileName(SearchRec.Name) Then Begin SortFiles(SearchRec.Name,Files); If SearchRec.Name = IntToStr(Index_Record) Then BIndex_Record := True; End; Found := FindNext ( SearchRec ); END; FindClose ( SearchRec ); Result := 0; If BIndex_Record = False Then Result := Result OR Index_Record; End; {That's really dirty code, but it work :-) } Procedure WriteCategoryRec(Verbosity : Integer; Category, CacheDir : String); Var Input : FILE of Byte; B1,B2 : Byte; I,II : LongInt; Name : Integer; Req_Name : TStringList; Req_NameID : TStringList; Req_ID : TStringList; ZLib : Integer; Begin Req_Name := TStringList.Create; Req_NameID := TStringList.Create; Req_ID := TStringList.Create; Name := -1; ZLib := GetReq(CacheDir + IntToStr(Index_Record),Req_NameID, Req_Name, Req_ID); {Is there are category already?} If Req_NameID.Find(IntToStr(Category_Record_ID),I) = True Then Begin If Verbosity > 0 Then Writeln(MSG_Rem_Cat); Name:=StrToInt(Req_ID[I]); End; {No Category index There, foud a free UID} If Name = -1 Then For I:=2 to 100000 Do If FileExists(CacheDir+IntToStr(I)) = False Then Begin Name := I; Req_Name.Add(RESERVED_NAMES[Category_Record_ID]); Req_NameID.Add(IntToStr(Category_Record_ID)); Req_ID.Add(IntToStr(Name)); Break; End; If Name = -1 Then Begin Writeln(MSG_Error_FindFile); Halt(1); End; {Write a New Index Record} AssignFile ( Input, CacheDir+IntToStr(Index_Record)); FileMode:=1; ReWrite ( Input ); {UID} I := Index_Record; B1 := (I SHR 8) AND $FF; B2 := I AND $FF; Write(Input,B1); Write(Input,B2); {Version} I := ZLib; B1 := (I SHR 8) AND $FF; B2 := I AND $FF; Write(Input,B1); Write(Input,B2); {Records} I := Req_ID.Count-1; B1 := (I SHR 8) AND $FF; B2 := I AND $FF; Write(Input,B1); Write(Input,B2); For II:= 1 To Req_ID.Count-1 Do Begin {Name} I := StrToInt(Req_NameID[II]); B1 := (I SHR 8) AND $FF; B2 := I AND $FF; Write(Input,B1); Write(Input,B2); {ID} I := StrToInt(Req_ID[II]); B1 := (I SHR 8) AND $FF; B2 := I AND $FF; Write(Input,B1); Write(Input,B2); End; CloseFile(Input); If Verbosity > 0 Then Writeln(Format(MSG_New_Cat,[Category])); {Write the Category Record} AssignFile ( Input, CacheDir+IntToStr(Name)); FileMode:=1; ReWrite(Input); I := Name; B1 := (I SHR 8) AND $FF; B2 := I AND $FF; Write(Input,B1); Write(Input,B2); I := 0; B1 := (I SHR 8) AND $FF; B2 := I AND $FF; Write(Input,B1); Write(Input,B2); I := 0; B1 := (I SHR 8) AND $FF; B2 := I AND $FF; Write(Input,B1); Write(Input,B2); I := Category_Record_CT; B1 := (I SHR 8) AND $FF; B2 := I AND $FF; Write(Input,B2); Write(Input,B1); For I:=1 To Length(Category) Do Begin B1 := Ord(Category[I]); Write(Input,B1); End; B1 := 0; Write(Input,B1); CloseFile(Input); End; END. plucker-1.8/conduit/source.w32/Conduit.dpr0100644000076400001440000004341507443507021017547 0ustar mickeusers{********************************************************************} { } { Program Name: Plucker conduit for Win32 Version 1.72 } { Source Language: Delphi 3 } { Author: Dirk Heiser } { } {********************************************************************} { If you find Spelling Errors or Bugs feel free to report this to } { me. } { } { Distributable under the GNU General Public License } { Version 2 or newer. } { } { You need TPalmUserData Class for Delphi: } { Copyright 1997 by Art Dahm Web: http://palm.dahm.com } { } { Description: } { Conduit for Plucker running under Win32. } { } { Usage: } { -dir : Dir where your Plucker Data are stored } { -user : Pilot user Name, if set DB will installed for Hotsync} { -cache : Dirname for you cache Dir. Default "Cache\" } { -id : Creator ID for the Database. Default "Plkr" } { -dbversion : Versions number for the Database. Default "7" } { -dbname : Database Name. Dafault "PluckerDB" } { -fname : Filename for the Database. Default "PluckerDB.pdb" } { -fix : 0x0D0A Sequenses are converted to 0x0A } { -install : Install a Pilot File. -User must be set, -dir not } { -verbose : Set the Verbose Level. Default are 1 } { 0 = Verbosity level 0 is silent except for errors } { 1 = Verbosity level 1 gives progress status } { 2 = Verbosity level 2 is used for debugging } { -copyprev : Set the CopyPrevention Flag } { -backup : Set the Backup Flag } { -launchable: Set the Launchable Flag } { } { Credits: } { Art Dahm for the TPalmUserData Class for Delphi. } { See the Files in .\PalmUserData\ for more infos } { } {********************************************************************} { } { Revision History } { v# ,Date ,Author Name ,Description } { 1.0 ,10/21/1999 ,Dirk Heiser ,First Version } { 1.1 ,11/03/1999 ,Dirk Heiser ,Add new Command Line Parameters } { 1.2 ,11/08/1999 ,Dirk Heiser ,Add DBVersion Command Line Para.} { 1.3 ,11/09/1999 ,Dirk Heiser ,Add -install Command Line Param.} { 1.4 ,12/18/1999 ,Dirk Heiser ,Add Max Size Check. } { Set Default DB Version to "6" } { Change -nofix param. to -fix } { 1.41 ,12/23/1999 ,Dirk Heiser ,Fixed a little Bug on the max. } { Rec Size Calculation } { 1.42 ,03/04/2000 ,Dirk Heiser ,Recompiled with a new Version of} { the PalmUserData Class } { Set the Default DBVersion to "7"} { 1.5 ,05/10/2000 ,Dirk Heiser Added Verbose Switch } { Switch DB Attr CopyPrevention } { Switch DB Attrib Backup } { Switch DB Attrib Launchable } { Mod Time are set to Create Time } { Records are sorted by Number } { Writing icons in PQA App info } { 1.51 ,06/05/2000 ,Dirk Heiser Check Presence of Rec 1 & 2 } { Check Record size >=2 } { -icon now public } { Debug view change for new format} { PQA Appinfo Block versionformat } { RecName enhanced (Debug view) } { Set DB Version to 8 } { 1.52 ,06/06/2000 ,Dirk Heiser Correct the About screen } { 1.53 ,06/07/2000 ,Dirk Heiser Set the UID to Zero } { 1.54 ,06/28/2000 ,Dirk Heiser Set DB Version to 9 } { Max Rec Size to 64KB } { Max DBName Length to 26 } { Add PalmConst.pas for Palm const} { 1.55 ,07/03/2000 ,Dirk Heiser Changes for the new DB Format } { 1.56 ,07/05/2000 ,Dirk Heiser Changes for the new DB Format } { More Detiled DB Statistik } { 1.6 ,08/01/2000 ,Dirk Heiser Changes for the new DB Format } { DB Version to 1 } { Check for Filename == UID } { 1.61 ,08/22/2000 ,Dirk Heiser Change Max DBName length to 31 } { Support for Categorys } { 1.7 ,10/16/2000 ,Dirk Heiser Changes to be compatible with } { Virtual Pascal and copiled with } { Virtual Pacal } { Max. Record size set to 65505 b.} { 1.71 ,03/03/2002 ,Dirk Heiser Fix for install DB for the visor} { Desktop Software. } { Support for the Metadata Record.} { 1.72 ,03/11/2002 ,Dirk Heiser More than one user with ";" } { } {********************************************************************} PROGRAM Conduit; {$IFNDEF VIRTUALPASCAL} {$APPTYPE CONSOLE} {$ENDIF} USES SysUtils, Classes, ConstStrings, DBTools, Tools, PalmConst; VAR Data : TMemoryStream; Header : TMemoryStream; AppInfo : TMemoryStream; Sizes : TStringList; Names : TStringList; Req_NameID : TStringList; Req_Name : TStringList; Req_ID : TStringList; TempData : PByteArray; Config : TConfig; Input : FILE; Pos : LongInt; Counter : LongInt; Groesse : Longint; I, II, III : Longint; Padding : LongInt; AppInfoSize : LongInt; AppInfoPos : LongInt; SizeDoc : LongInt; SizeBmp : LongInt; SizeMailto : LongInt; SizeLinks : LongInt; SizeBookmarks : LongInt; SizeRest : LongInt; SizeHeader : LongInt; BEGIN {******************************************************************} {******************************************************************} {* Check Command Line and Write Welcome message *} {******************************************************************} {******************************************************************} IF CheckCommandLine ( Config ) = False THEN BEGIN Write ( MSG_Welcome ); Write ( MSG_Usage ); Halt ( 1 ); END; If Config.Verbose > 1 Then Write ( MSG_Welcome ); InstallFile ( Config.Install, Config.User, Config.Verbose ); If length ( Config.Plucker_Dir ) < 1 Then Halt ( 0 ); {******************************************************************} {******************************************************************} {******************************************************************} {******************************************************************} {* Read the Datas and Write to a Stram *} {******************************************************************} {******************************************************************} If Config.Verbose > 0 THEN WriteLn ( Format ( MSG_Reading, [ Config.Plucker_Dir + Config.Cache + FileMask ] ) ); Data := TMemoryStream.Create; Sizes := TStringList.Create; Names := TStringList.Create; Req_Name:= TStringList.Create; Req_NameID:= TStringList.Create; Req_ID:= TStringList.Create; If Length(Config.Category)>0 Then WriteCategoryRec(Config.Verbose,Config.Category,Config.Plucker_Dir + Config.Cache); I := GetFileList(Config.Plucker_Dir + Config.Cache + FileMask,Names); IF Names.Count < 1 THEN BEGIN If Config.Verbose = 0 THEN WriteLn ( Format ( MSG_Reading, [ Config.Plucker_Dir + Config.Cache + FileMask ] ) ); WriteLN ( MSG_Error_Dir ); Halt ( 1 ); END; If I <> 0 Then BEGIN IF (I AND Index_Record) = Index_Record Then WriteLN ( MSG_Error_Index ); Halt ( 1 ); END; If Config.Verbose > 0 THEN WriteLn ( Format ( MSG_DBType, [ CompressionTypes[GetReq(Config.Plucker_Dir + Config.Cache + IntToStr(Index_Record),Req_NameID, Req_Name, Req_ID) ]] ) ) ELSE GetReq(Config.Plucker_Dir + Config.Cache + IntToStr(Index_Record),Req_NameID, Req_Name, Req_ID); SizeDoc:=0; SizeBmp:=0; SizeMailto:=0; SizeLinks:=0; SizeBookmarks:=0; SizeRest:=0; SizeHeader:=0; For I:=0 To Names.Count-1 DO BEGIN AssignFile ( Input, Config.Plucker_Dir + Config.Cache + Names[I] ); FileMode := 0; Reset ( Input, 1 ); If Config.Verbose > 1 THEN Write ( Format ( MSG_Read_File, [ IntToStr ( I+1 ), Names[I], Names[I], IntToStr ( FileSize ( Input ) ) ] ) ); TRY GetMem ( TempData, FileSize ( Input ) ); BlockRead ( Input, TempData^, FileSize ( Input ) ); Groesse := FileSize ( Input ); CheckUID(TempData,StrToInt(Names[I])); IF Config.Fix THEN FOR II := 0 TO FileSize ( Input ) - 2 DO IF ( TempData^ [ II ] = $0D ) AND ( TempData^ [ II + 1 ] = $0A ) THEN BEGIN FOR III := II TO FileSize ( Input ) - 1 DO TempData^ [ III ] := TempData^ [ III + 1 ]; Groesse := Groesse - 1; END; If Groesse < DBMinRecSize Then BEGIN WriteLN ( Format ( MSG_Error_Record, [ IntToStr(Groesse) ] ) ); Halt ( 1 ); END; If Groesse > RecMax Then BEGIN If Config.Verbose < 2 THEN Write ( Format ( MSG_Read_File, [ IntToStr ( I+1 ), Names[I], Names[I], IntToStr ( FileSize ( Input ) ) ] ) ); WriteLN ( Format ( MSG_Error_Size, [ IntToStr(RecMax) ] ) ); Halt ( 1 ); END; Data.Write ( TempData^, Groesse ); Sizes.Add ( IntToStr ( Groesse ) ); CloseFile ( Input ); If Config.Verbose > 1 THEN WriteLN ( MSG_Done ); If Config.Verbose > 1 THEN Writeln(Format(MSG_FileInfo,[GetRecName(StrToInt(Names[I]),Req_Name, Req_ID),CT[GetCT(TempData,StrToInt(Names[I]))]])); IF StrToInt(Names[I]) = Index_Record Then SizeHeader := SizeHeader + Groesse+20 ELSE Case GetCT(TempData,StrToInt(Names[I])) OF 0: SizeDoc:=SizeDoc+Groesse+20; 1: SizeDoc:=SizeDoc+Groesse+20; 2: SizeBmp:=SizeBmp+Groesse+20; 3: SizeBmp:=SizeBmp+Groesse+20; 4: SizeMailto:=SizeMailto+Groesse+20; 5: SizeLinks:=SizeLinks+Groesse+20; 6: SizeLinks:=SizeLinks+Groesse+20; 7: SizeLinks:=SizeLinks+Groesse+20; 8: SizeBookmarks:=SizeBookmarks+Groesse+20; 9: SizeHeader:=SizeHeader+Groesse+20; 10: SizeHeader:=SizeHeader+Groesse+20; else SizeRest:=SizeRest+Groesse+20; End; FreeMem ( TempData ); EXCEPT If Config.Verbose < 2 THEN Write ( Format ( MSG_Read_File, [ IntToStr ( I+1 ), Names[I], Names[I], IntToStr ( FileSize ( Input ) ) ] ) ); WriteLN ( Format ( MSG_Error_FileR, [ Names[I] ] ) ); Halt ( 1 ); END; END; {******************************************************************} {******************************************************************} {******************************************************************} {******************************************************************} {* Build the Header and the Index and write to the Stream *} {******************************************************************} {******************************************************************} Padding := 2; AppInfo := TMemoryStream.Create; If Length(Trim(Config.AppInfo)) > 0 Then Begin MakePQAAppInfoBlock(Config.AppInfo,Config.DBName,IntToStr(Config.DBVersion), AppInfo); AppInfoSize := AppInfo.Size; AppInfoPos := 78+Padding+(Names.Count*8); End Else Begin AppInfoSize := 0; AppInfoPos := 0; End; Header := TMemoryStream.Create; MakeDBHeader ( Config.DBName, Config.DBVersion, Now, Now, mydmNullTime, DBType, Config.DBID, Names.Count,Config.HFlags, AppInfoPos, Header ); Counter := 0; FOR I := 0 TO Names.Count - 1 DO BEGIN Pos := 78 + Padding + ( Names.Count * 8 ) + Counter + AppInfoSize; MakeDBIndexEntry ( Pos, Record_attrib, StrToInt(Names.Strings[I]), Header ); Counter := Counter + StrToInt ( Sizes.Strings [ I ] ); END; I := 0; Header.WriteBuffer ( I, 2 ); {******************************************************************} {******************************************************************} {******************************************************************} {******************************************************************} {* Put the Header&Index and the Data together and Save to File *} {******************************************************************} {******************************************************************} TRY If Length(Trim(Config.AppInfo)) > 0 Then AppInfo.SaveToStream ( Header ); Data.SaveToStream ( Header ); If Config.Verbose > 0 Then Write ( Format ( MSG_Write_DB, [ Config.Plucker_Dir + Config.FName, IntToStr ( Trunc ( Header.Size / 1024 ) ) ] ) ); Header.SaveToFile ( Config.Plucker_Dir + Config.FName ); If Config.Verbose > 0 Then WriteLN ( MSG_Done ); I := 0; If Config.Verbose > 1 Then WriteLN ( Format ( MSG_WriteDB_Info, [ Format('%8.2f',[SizeDoc/1024]), Format('%8d',[SizeDoc]), Format('%8.2f',[(SizeDoc*100)/(SizeDoc+SizeBmp+SizeMailto+SizeLinks+SizeBookmarks+SizeHeader+SizeRest+84+I)]), Format('%8.2f',[SizeBmp/1024]), Format('%8d',[SizeBmp]), Format('%8.2f',[(SizeBmp*100)/(SizeDoc+SizeBmp+SizeMailto+SizeLinks+SizeBookmarks+SizeHeader+SizeRest+84+I)]), Format('%8.2f',[SizeMailto/1024]), Format('%8d',[SizeMailto]), Format('%8.2f',[(SizeMailto*100)/(SizeDoc+SizeBmp+SizeMailto+SizeLinks+SizeBookmarks+SizeHeader+SizeRest+84+I)]), Format('%8.2f',[SizeLinks/1024]), Format('%8d',[SizeLinks]), Format('%8.2f',[(SizeLinks*100)/(SizeDoc+SizeBmp+SizeMailto+SizeLinks+SizeBookmarks+SizeHeader+SizeRest+84+I)]), Format('%8.2f',[SizeBookmarks/1024]), Format('%8d',[SizeBookmarks]), Format('%8.2f',[(SizeBookmarks*100)/(SizeDoc+SizeBmp+SizeMailto+SizeLinks+SizeBookmarks+SizeHeader+SizeRest+84+I)]), Format('%8.2f',[SizeRest/1024]), Format('%8d',[SizeRest]), Format('%8.2f',[(SizeRest*100)/(SizeDoc+SizeBmp+SizeMailto+SizeLinks+SizeBookmarks+SizeHeader+SizeRest+84+I)]), Format('%8.2f',[(SizeHeader+84+I)/1024]), Format('%8d',[SizeHeader+84+I]), Format('%8.2f',[((SizeHeader+84+I)*100)/(SizeDoc+SizeBmp+SizeMailto+SizeLinks+SizeBookmarks+SizeHeader+SizeRest+84+I)]), Format('%8.2f',[(SizeDoc+SizeBmp+SizeMailto+SizeLinks+SizeBookmarks+SizeHeader+SizeRest+84+I)/1024]), Format('%8d',[(SizeDoc+SizeBmp+SizeMailto+SizeLinks+SizeBookmarks+SizeHeader+SizeRest+84+I)]), Format('%8.2f',[((SizeDoc+SizeBmp+SizeMailto+SizeLinks+SizeBookmarks+SizeHeader+SizeRest+84+I)*100)/(SizeDoc+SizeBmp+SizeMailto+SizeLinks+SizeBookmarks+SizeHeader+SizeRest+84+I)]) ])); EXCEPT If Config.Verbose = 0 Then Write ( Format ( MSG_Write_DB, [ Config.Plucker_Dir + Config.FName, IntToStr ( Round ( Header.Size / 1024 ) ) ] ) ); WriteLN ( Format ( MSG_Error_Save, [ Config.Plucker_Dir + Config.FName ] ) ); Halt ( 1 ); END; {******************************************************************} {******************************************************************} {******************************************************************} {******************************************************************} {* Check if Install for User need, get a List of User and Install *} {* if a valid user Found *} {******************************************************************} {******************************************************************} InstallFile(Config.Plucker_Dir + Config.FName,Config.User, Config.Verbose); {******************************************************************} {******************************************************************} {******************************************************************} {******************************************************************} {* Free the Mem *} {******************************************************************} {******************************************************************} Req_Name.Free; Req_NameID.Free; Req_ID.Free; Sizes.Free; Names.Free; Data.Free; Header.Free; AppInfo.Free; {******************************************************************} {******************************************************************} END. plucker-1.8/conduit/source.w32/Resource.rc0100644000076400001440000000336007443507021017543 0ustar mickeusers#define APP_VERSION_MAJOR 1 #define APP_VERSION_MINOR 72 #define APP_VERSION_MICRO 0 #define APP_VERSION_BUILD 0 #define APP_VERSION_STRING "1.72.0.0" #define APP_VERSION_DIZ "Build and install an Plucker database file." #define APP_VERSION_FILENAME "Conduit" #define APP_VERSION_TYPE VFT_APP #define APPLICATIONNAME "Plucker" #define APPLICATIONURL "http://www.plkr.org/" #define APPLICATIONCOMPANY "The Plucker Team" #define APPLICATIONCOPYRIGHT "1999-2001 by The Plucker Team" #define APPLICATION_VERSION "1.x" #define APPLICATION_VERSION_MAJOR 1 #define APPLICATION_VERSION_MINOR 0 #define APPLICATION_VERSION_MICRO 0 #define APPLICATION_VERSION_BUILD 0 1 RCDATA .\Icons\pluckerpdb_b.tbmp 2 RCDATA .\Icons\pluckerpdb_s.tbmp VERSIONINFO_1 VERSIONINFO FILEVERSION APP_VERSION_MAJOR, APP_VERSION_MINOR, APP_VERSION_MICRO, APP_VERSION_BUILD PRODUCTVERSION APPLICATION_VERSION_MAJOR, APPLICATION_VERSION_MINOR, APPLICATION_VERSION_MICRO, APPLICATION_VERSION_BUILD FILEOS VOS__WINDOWS32 FILETYPE APP_VERSION_TYPE { BLOCK "StringFileInfo" { BLOCK "040904E4" { VALUE "InternalName", APP_VERSION_FILENAME"\000" #if APP_VERSION_TYPE == VFT_APP VALUE "OriginalFilename", APP_VERSION_FILENAME".exe\000" #endif #if APP_VERSION_TYPE == VFT_DLL VALUE "OriginalFilename", APP_VERSION_FILENAME".dll\000" #endif VALUE "FileVersion", APP_VERSION_STRING"\000" VALUE "FileDescription", APP_VERSION_DIZ"\000" VALUE "CompanyName", APPLICATIONCOMPANY"\000" VALUE "LegalCopyright", APPLICATIONCOPYRIGHT"\000" VALUE "ProductName", APPLICATIONNAME"\000" VALUE "ProductVersion", APPLICATION_VERSION"\000" } } BLOCK "VarFileInfo" { VALUE "Translation", MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US), CHARSET_MULTILINGUAL } } plucker-1.8/conduit/sync.pl0100755000076400001440000002153007544623441015036 0ustar mickeusers#!/usr/bin/perl -w # # Perl-Conduit for Plucker # #------------------------------------------------------------------ # 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: # Free Software Foundation, Inc. # 59 Temple Place - Suite 330 # Boston, MA 02111-1307, USA. #------------------------------------------------------------------ use diagnostics; use PDA::Pilot; use Data::Dumper; use Env qw(HOME); use Getopt::Long; # Determine the OS of the unit. $device for OS/2 # was changed from 'COM1' to '/dev/com1', because # OS/2 supports devices just like linux/unix do # From the docs: # # $^O The name of the operating system under # which this copy of Perl was built, as # determined during the configuration # process. The value is identical to # $Config{'osname'}. # # Remember to set the link under linux and Solaris # machines in /dev, or pilot-link will fail. USB users # will need to make sure that /dev/ttyUSB{#} is assigned # for each port they use. $device = ($^O eq 'os2' && '/dev/com1') || ($^O eq 'MSWin32' && 'COM1') || '/dev/pilot'; ##################################################### # # Assign some basic global parameters here # ##################################################### $pluckerhome = $HOME . '/.plucker'; # where Plucker stores data $ViewerAppID = 'Plkr'; # Creator ID $ViewerDBType = 'Data'; # Data type $ViewerDBVersion = 7; # PluckerDB internal version $database = 'PluckerDB'; # Name of the output DB ##################################################### # # use 'db' for to-disk PluckerDB writes or keep the quotes # blank for output directly to the serial port # ##################################################### $output = 0; # 0: serial, 1: disk @databases = ('PluckerDB'); @cachedirs = ('.plucker'); &GetOptions("name=s" => \$database, "cache=s" => \$pluckerhome, "database" => \$output, "port=s" => \$device); @databases = split(/\s/, $database); @cachedirs = split(/\s/, $pluckerhome); ##################################################### # # Print the application splash using a standard # 'here-print' syntax. # ##################################################### print <<_EOF_; @{[ "="x55 ]} Plucker conduit written in Perl @{[ "="x55 ]} ---o-o--- (c) 2000 by the Plucker Development Team ---o--o-- based on the original conduit written by ---o-o--- Mark Lillywhite. This version written by ---o----- Alexander Wagner and David Desrosiers. ---o----- Special thanks to: Holger Duerer, and Alan Harder & Kenneth Albanowski email: plucker-team\@rubberchicken.org Currently running OS : $^O Communicating via : $device source -> database created : _EOF_ if (($#databases != $#cachedirs)) { die "\n--> ERROR: You did not specify the same number of cachedirs and databases!\n"; } for $i (0 .. $#databases) { print " $i: $cachedirs[$i] -> $databases[$i]\n"; } if ($output == 1) { my %dbinfo = ( flagReadOnly => 0, flagResource => 0, flagBackup => 0, flagOpen => 0, flagAppInfoDirty => 0, flagNewer => 0, flagReset => 0, flagExcludeFromSync => 0, modnum => 0, index => 0, createDate => 0, modifyDate => 0, backupDate => 0, type => $ViewerDBType, creator => $ViewerAppID, version => $ViewerDBVersion, name => $database ); for $i (0 .. $#databases) { $pluckerhome = $cachedirs[$i]; $database = $databases[$i]; $filename = $pluckerhome . "/" . $database . ".pdb"; $db = PDA::Pilot::File::create($filename, \%dbinfo); $type = "$pluckerhome/$database"; print "\n ", "-"x50, "\n"; print " pdb file '$filename' created... \n"; print " ", "-"x50, "\n\n"; &read_dir; } } else { $type = "handheld"; # Open the device and get the socket with DLP $socket = PDA::Pilot::openPort($device); print "\n ", "-"x30, "\n"; print " Now press HotSync button... \n"; print " ", "-"x30, "\n\n"; $dlp = PDA::Pilot::accept($socket); ##################################################### # # Extract the username from the device after opening # ##################################################### $ui = $dlp->getUserInfo; print '='x15, "[ Syncing: $ui->{name} ]", '='x15, "\n \n"; print " Connection established!\n"; $dlp->getStatus(); ##################################################### # # Delete the plucker database on-palm by destroying # the creator ID on the device (another DLP function) # ##################################################### $syncsize = 0; for $i (0 .. $#databases) { print "\n\n Current database: $databases[$i] \n"; $pluckerhome = $cachedirs[$i]; $database = $databases[$i]; print "$pluckerhome ---> $database\n"; print " Removing old Plucker-database"; $dlp->delete($database); print " --> done.\n"; ##################################################### # # Create a new database on-palm, using the reverse # of the above # ##################################################### print " Creating new Plucker-database"; $db = $dlp->create($database, $ViewerAppID, $ViewerDBType, 0, $ViewerDBVersion); print " --> done.\n"; &read_dir; $db->close(); } } $syncsize >>= 10; $i = $#databases + 1; printf "\n %i kB transfered to $type\n", $syncsize; print " using $i databases\n"; print " Closing Plucker cache directory ...\n"; closedir(PDir); ##################################################### # # Close and clean up a bit, dumping some debug # information to STDOUT # ##################################################### $db->close(); print " Plucker database created and closed in $pluckerhome\n\n" if ($output == 1); print " Plucker is updated. Closing conduit...\n\n"; print "="x13, "[ Syncing: $ui->{name} done]", "="x13, "\n" if ($output != 1); sub read_dir { ##################################################### # # Read in the cache directory and parse it's files # for output to the PluckerDB structures or to the # serial port, in the case of a direct serial link # ##################################################### $pcache = $pluckerhome . "/cache"; print " \nUsing $pcache as input.\n"; opendir PDir, "$pcache" or die "Can't open directory $pcache: $!\n"; print " $pcache directory opened, now processing files...\n"; $i = 0; @files = grep !/^\./, readdir(PDir); for $file (sort {$a <=> $b} @files) { open(PFile, "< $pcache/$file") or die "Can't open $pcache/$file: $!"; $size = (stat("$pcache/$file"))[7]; $recordID = $file; # Filenames are record ID's $syncsize += $size; print " |\n"; print " [ $recordID ] processing...\n"; print " |--> Reading file "; ##################################################### # # Read the complete file to $data and process it # there. This was changed from a previous method # which proved to be substantially slower. # ##################################################### sysread PFile, $data, $size; print " --> $size Bytes done.\n"; print " |--> Adding data... "; if ($output == 1) { $db->addRecordRaw($data, $recordID, 0, 0); } else { $rec = $db->newRecord(); $rec->{'category'} = 0; $rec->{'deleted'} = 0; $rec->{'archived'} = 0; $rec->{'secret'} = 0; $rec->{'modified'} = 1; $rec->{'raw'} = $data; $rec->{'id'} = $recordID; $db->setRecord($rec); } print " --> done.\n"; close(PFile); } } # "The End(tm)" - David A. Desrosiers plucker-1.8/REQUIREMENTS0100644000076400001440000001236407740361173013727 0ustar mickeusersPlucker System Requirements --------------------------- PalmOS viewer: Models: Palm OS devices running OS 2.0.3 or later GTK viewer: Operating systems: Unix (Linux, Solaris, Mac OS X, BSD, etc.) Software: GUI toolkit GTK+, version 2 or later Distiller: Operating systems: Unix (Linux, Solaris, Mac OS X, BSD, etc.), Windows Software: Python (1.5.2 or later) Note that the Python that comes with Redhat Linux has a mysterious bug that causes some URLs to be truncated; better to re-install from www.python.org. Image support software: on Unix: one of the following: ImageMagick 5.4.4 or later PIL 1.1 or later (may already be in your Python) netpbm 9.15 or later on Windows: ImageMagick & Bmp2Tbmp Desktop: Operating Systems: Linux/Unix, OS/2, Windows Software: Python (1.5.2 or later), wxWindows (for GUI desktop) Additional software (e.g. to include images): ImageMagick, pilot-link (including the Pilot.pm module), perl, netpbm 9.15 or later, jpeg (djpeg) Where you find the tools: python : http://www.python.org/ PIL : http://www.pythonware.com/products/pil/ ImageMagick: http://www.imagemagick.org/ netpbm : http://netpbm.sourceforge.net/ pilot-link : http://pilot-link.org/ perl : http://www.perl.com/ jpeg : ftp://ftp.uu.net/graphics/jpeg/ wxWindows : http://www.wxwindows.org GTK+ : http://www.gtk.org/ JIU : http://jiu.sourceforge.net/ Jython : http://www.jython.org/ Java : http://java.sun.com/ OS/2 tools : http://www.leo.org/pub/comp/os/os2/leo : http://cip.physik.uni-wuerzburg.de/~arwagner/products/plucker/download Windows tools : Python 1.5.2 : http://www.python.org/download/download_windows.html ImageMagick : ftp://ftp.wizards.dupont.com/pub/ImageMagick/win2k/ImageMagick-win2k.zip Bmp2Tbmp : http://www.Dirk-Heiser.de/Bmp2Tbmp/ It should be possible to get Plucker running on other Unix systems too. If you get it running on some system not listed above, then please notify us so we can add it to the list. We can be reached at plucker-team@rubberchicken.org Development (in general) ------------------------ To configure the source, you will need various tools, depending on what sections of the project you are working on. See the below sections for information on specific tools. In general, to configure the system, you will need GNU Autoconf 2.13. Do not try to use 2.5x; it seems to have oddities that don't work with our configure.in file. To configure, do not run "configure" directly; instead, run the top level shell script "autogen.sh", passing it the options you would normally pass to configure. Palm OS viewer development -------------------------- If you want to compile the viewer you have to install the necessary development tools (and make sure that they are in your path). Where you find the tools: prc-tools: http://prc-tools.sourceforge.net/ SDK5: http://www.palmos.com/cgi-bin/sdk50.cgi pilrc (v2.8 or later): http://www.pilrc.com/ See the README in the viewer dir for additional info. Python distiller development ---------------------------- You will need to have Python (1.5.2 or later) and one of the image-processing libraries detailed above installed to work on the distiller. You should have the full path to the directory "SRC/parser/python" in your PYTHONPATH environment variable. You can run the distiller with the command line: $ python /SRC/parser/python/PyPlucker/Spider.py [command-line-args] Java distiller development -------------------------- The Java distiller *is* the Python distiller, so to work on the functionality of it, you will need the same things you need for the Python distiller. To compile the Java jar file for it, you will need in addition Java (1.2 or later), Jython (2.1 or later) and the Java Imaging Utilities (JIU) image-processing library (0.10.0 or later). Documentation development ------------------------- If you want to build or work on the Documentation, you will also need LaTeX and LaTeX2HTML and its associated tools -- Perl 5, TeX, dvips, ghostscript, and netpbm (see the Latex2HTML docs for info on where to obtain these). You will also need GNU sed. LaTeX: ftp://ftp.tug.org/tex/ Latex2HTML: http://ctan.tug.org/ctan/tex-archive/support/latex2html GNU sed: ftp://ftp.gnu.org/gnu/sed/ NOTE: the latex2html installation must support GIF images. Plucker Desktop Development --------------------------- If you want to compile Plucker Desktop, you will need the Free wxWindows cross-platform C++ development toolkit. Version 2.4.2 or higher of wxWindows higher is required. A C++ compiler supported by wxWindows is also needed: GCC on POSIX systems, Borland or MSVC or Cygwin on Microsoft Windows are the recommended compilers, and the built-in free Developer Tools GCC compiler on Apple OS X, but all common C++ compilers can be used. See the plucker_desktop/docs/BUILDING*.txt files for full details and step-by-step instructions for Linux, Microsoft Windows and others. Where you find the development tools: wxWindows: http://www.wxwindows.org GCC: http://www.gnu.org/software/gcc/gcc.html plucker-1.8/tools/0040755000076400001440000000000010052675410013206 5ustar mickeusersplucker-1.8/tools/scripts/0040755000076400001440000000000010052665033014675 5ustar mickeusersplucker-1.8/tools/scripts/Win32/0040755000076400001440000000000010052665034015600 5ustar mickeusersplucker-1.8/tools/scripts/Win32/plucker-outlook-makro.txt0100644000076400001440000000322607742054763022624 0ustar mickeusersOption Explicit ' This VBA Macro is for use in MS-Outlook. ' It will write all plucker notes to a file so you can use it, ' You can easily change the code so the notes are deleted ' You can also easily change the code so the notes are put ' together into one note. ' ' I use this code together with some javascript in a static web page ' to open all the URLs when I am at my desktop computer: ' The makro starts an editor, I use that to delete all the ' non-URL lines, then cut-and-paste to a textarea field in the web page ' and push a button that opens all the pages at once. Dim shellresult As Double Dim x As String Dim note As Variant Const outfilename = "C:\\tmp\\pluckerstuff.txt" Sub plucker() x = "" For Each note In GetNamespace("MAPI").GetDefaultFolder(olFolderNotes).Items If InStr(1, note.Body, "Plucker URLs", vbTextCompare) = 1 _ And InStr(1, note.Body, "Plucker URLs a", vbTextCompare) <> 1 Then x = x & Chr(13) & Chr(10) & Chr(13) & Chr(10) & "=> " & note.Body If note.Categories <> "Plucker stuff" Then note.Categories = "Plucker stuff" note.Save End If ' Want to delete the notes after writing? ' then put this line out of comments: ' note.delete End If Next note Open outfilename For Output As #1 Print #1, x Close #1 ' uncomment one of these lines to open the outfile in an editor ' of your choice ' shellresult = Shell("gvim " & outfilename, vbNormalFocus) ' shellresult = Shell("notepad " & outfilename, vbNormalFocus) End Sub plucker-1.8/tools/scripts/Win32/bookmarklet.htm0100644000076400001440000001362107742054763020641 0ustar mickeusersBookmarklets for extracting form data

Bookmarklets for extracting form data (e.g. for POST forms in Plucker)

This page contains two bookmarklets.

Bookmarklets are little snippets of Javascript code designed to reside in your favorites or bookmarks or linklist or toolbar or whatever you call it. The idea is to store a bit of Javascript functionality so you can conveniently call it on a page where it is relevant.

Useage Scenario

The bookmarklets contained in this file are relevant to web pages that contain forms. The useage scenario is as follows:

You are on a web page with a form, and you wish to automatically submit this form in the future. For example, you may wish to provide the form data to the Plucker distiller so you can "pluck" the resulting page. For forms of method GET, you could simply submit the form and get the URL of the resulting page. For POST forms, this will not solve your problem.

Solution

First, you fill in the form. Then you select the bookmarklet from your bookmark list (or doubleklick on the link in your toolbar). A new window will open which contains all the information you need to pluck the form results page. You copy-and-paste that information into your plucker file and are done.

In the Plucker documentation you will find information on how to pluck POST forms.

Installation

There are two versions of this bookmarklet: One for POST forms, one for GET forms. I could have put both into one bookmarklet, but Microsoft limited their length to 508 characters in MSIE 6.0, so I had to conserve space. (Earlier MSIE versions had a much larger limit.)

You can install them by right-clicking on the link and selecting "add to favorites" or by dragging and dropping the link onto your toolbar or whatever is appropriate for your browser.

This web page also contains an example for a form, so you can test the bookmarklets.

Bugs and Features

The bookmarklets are tested with MSIE 6, MSIE 5.5 and Opera 7.2, so I don't really know if they work on other browsers. You'll have to test for yourself.

To make it work on MSIE 6, I had to trim it to less than 509 bytes (it is 507 bytes for the GET version, 504 for the POST version). Therefore, the script does no error checking. That is, if you use it with a file upload field, it will probably give you an error. There is still some slack, though: It is not strictly necessary to check for reset and button fields for most forms. (It does no harm if their values are sent to the server.)

Also, as is usually the case with bookmarklets, I had to obfuscate the code: It has to fit in one line, and variable names should not clash with names on the page where the bookmarklet is used. I used "jX" as a common prefix for all identifiers the bookmarklets use to avoid name clashes.

For shortening the code, I have resorted to a lot of with statements, unusual loop conditions in for loops and checking the field type only by two characters, not by the whole type. Also, I put most of the field types in the default branch of the switch statement.


1 2 3

2003-09-10, Jahn Rentmeister, see http://www.jahns-home.de/plucker.htm for more info and newest version. Report problems to <rentmei AT uni-muenster.de> with "Bookmarklet" in the subject line. plucker-1.8/tools/scripts/Win32/batchopen.htm0100644000076400001440000000300207742054763020262 0ustar mickeusers Open URLs

plucker-1.8/tools/explode/0040755000076400001440000000000010052675410014646 5ustar mickeusersplucker-1.8/tools/explode/netscape4-plucker-helper.in0100644000076400001440000000027007473021020021773 0ustar mickeusers#!/bin/csh -f set dir=`@bindir@/explode $1` if $status then exit 1 endif @NETSCAPE_PROG@ -remote "openFile(""$dir/default.html"")" echo "@RM_PROG@ -rf $dir" | @AT_PROG@ now +1 hour plucker-1.8/tools/explode/README0100644000076400001440000000275607473014470015543 0ustar mickeusersThis directory contains an 'exploder' program, which writes a Plucker document to a specified directory as a set of HTML files and JPEG image files. The exploder app is included mainly as a test of the libunpluck library. To build this, you will need * libunpluck.a, from ../unpluck; * the libjpeg library, version 6b or later, from www.ijg.org; * the zlib library, from www.gzip.org/zlib/, version 1.1.4 or later. Make sure the include headers for libjpeg and libz are in your CPPFLAGS; if they are in non-standard places, you may need to set the CPPFLAGS environment variable before configuring Plucker. Similarly, make sure the library directories for -lz and -ljpeg are on the LIBS path, if they are in non-standard locations. "explode" has the following usage: explode PLUCKERDOC_FILENAME [DIRECTORY] which means that the Plucker document in PLUCKERDOC_FILENAME will be exploded into DIRECTORY. If no DIRECTORY is specified, a new one will be created in a suitable temporary location. If a DIRECTORY is specified, there should be no output from explode; if not, explode will write the name of the temporary directory to stdout. The root file for viewing will be DIRECTORY/default.html. Once you have the exploder compiled, it's fairly easy to make a helper app to show Plucker format docs in a Web browser. The MIME type is application/prs.plucker the file extension is "plkr", and a helper program for netscape 4 is in netscape4-plucker-helper (which does NOT get automatically installed). plucker-1.8/tools/explode/explode.c0100644000076400001440000016426410051652560016464 0ustar mickeusers/* -*- mode: c; indent-tabs-mode: nil; -*- */ #include #include #include #include /* for link */ #include #include #include /* This code requires the Independent JPEG Group libjpeg library, version 6b or later */ #include #include #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif #define GET_FUNCTION_CODE_TYPE(x) (((x)>>3) & 0x1F) #define GET_FUNCTION_CODE_DATALEN(x) ((x) & 0x7) #define CELLS(row,col) cells[row*cols+col] static void ShowWarning ( const char* formatSpec, ... ) { va_list ap; va_start (ap, formatSpec); (void) vfprintf (stderr, formatSpec, ap); fprintf (stderr, "\n"); va_end (ap); } typedef struct RecordNode_s { int index; int page_id; boolean done; struct RecordNode_s* next; } RecordNode; RecordNode* records = NULL; static int GetNextRecordNumber () { RecordNode* ptr; int i = 0; for (ptr = records; ptr != NULL; ptr = ptr->next) { if (!ptr->done) { i = ptr->index; break; } } return i; } static void LinkRecords ( char* dir ) { RecordNode* ptr; char* realfilename; char* linkname; realfilename = malloc (strlen (dir) + 20); linkname = malloc (strlen (dir) + 20); for (ptr = records; ptr != NULL; ptr = ptr->next) { if (ptr->page_id != ptr->index) { sprintf (realfilename, "%s/r%d.html", dir, ptr->page_id); sprintf (linkname, "%s/r%d.html", dir, ptr->index); link (realfilename, linkname); } } free (realfilename); free (linkname); } static int GetPageID ( int record_index ) { RecordNode* ptr; for (ptr = records; ptr != NULL; ptr = ptr->next) { if (ptr->index == record_index) return ptr->page_id; } return 0; } static void AddRecord ( int index ) { RecordNode* newr; RecordNode* ptr; for (ptr = records; ptr != NULL; ptr = ptr->next) { if (ptr->index == index) return; } newr = (RecordNode *) malloc (sizeof (RecordNode)); newr->done = FALSE; newr->index = index; newr->page_id = index; newr->next = records; records = newr; } static void MarkRecordDone ( int index ) { RecordNode* ptr; for (ptr = records; ptr != NULL; ptr = ptr->next) { if (ptr->index == index) { ptr->done = TRUE; return; } } if (ptr == NULL) { AddRecord (index); MarkRecordDone (index); } } static void SetPageID ( int index, int page_id ) { RecordNode* ptr; for (ptr = records; ptr != NULL; ptr = ptr->next) { if (ptr->index == index) { ptr->page_id = page_id; return; } } if (ptr == NULL) { AddRecord (index); SetPageID (index, page_id); } } static char* MailtoURLFromBytes ( unsigned char* record_data, int len ) { int to_offset; int cc_offset; int subject_offset; int body_offset; int url_size; char* url; char* bytes; bytes = record_data + 8; to_offset = (bytes[0] << 8) + bytes[1]; cc_offset = (bytes[2] << 8) + bytes[3]; subject_offset = (bytes[4] << 8) + bytes[5]; body_offset = (bytes[6] << 8) + bytes[7]; url_size = strlen ("mailto:") + 2; if (to_offset != 0) { url_size += strlen ((char *) (bytes + to_offset)); } if (cc_offset != 0) { url_size += (strlen ((char *) (bytes + cc_offset)) + strlen ("&cc=")); } if (subject_offset != 0) { url_size += (strlen ((char *) (bytes + subject_offset)) + strlen ("&subject=")); } if (body_offset != 0) { url_size += (strlen ((char *) (bytes + body_offset)) + strlen ("&body=")); } url = (char *) malloc (url_size); strcpy (url, "mailto:"); if (to_offset != 0) { strcpy (url + strlen (url), ((char *) (bytes + to_offset))); } if ((cc_offset != 0) || (subject_offset != 0) || (body_offset != 0)) { strcpy (url + strlen (url), "?"); } if (cc_offset != 0) { strcpy (url + strlen (url), "cc="); strcpy (url + strlen (url), (char *) (bytes + cc_offset)); } if (subject_offset != 0) { strcpy (url + strlen (url), "subject="); strcpy (url + strlen (url), (char *) (bytes + subject_offset)); } if (body_offset != 0) { strcpy (url + strlen (url), "body="); strcpy (url + strlen (url), (char *) (bytes + body_offset)); } return url; } /***********************************************************************/ /***********************************************************************/ /***** *****/ /***** Code to decode the Palm image format to JPEG *****/ /***** *****/ /***********************************************************************/ /***********************************************************************/ #define READ_BIGENDIAN_SHORT(p) (((p)[0] << 8)|((p)[1])) #define READ_BIGENDIAN_LONG(p) (((p)[0] << 24)|((p)[1] << 16)|((p)[2] << 8)|((p)[3])) #define PALM_IS_COMPRESSED_FLAG 0x8000 #define PALM_HAS_COLORMAP_FLAG 0x4000 #define PALM_HAS_TRANSPARENCY_FLAG 0x2000 #define PALM_DIRECT_COLOR_FLAG 0x0400 #define PALM_4_BYTE_FIELD_FLAG 0x0200 #define PALM_COMPRESSION_SCANLINE 0x00 #define PALM_COMPRESSION_RLE 0x01 #define PALM_COMPRESSION_PACKBITS 0x02 #define PALM_COMPRESSION_NONE 0xFF #define PALM_COLORMAP_SIZE 232 typedef struct { unsigned char red; unsigned char green; unsigned char blue; } ColorMapEntry; static ColorMapEntry Palm8BitColormap[] = { {255, 255, 255}, {255, 204, 255}, {255, 153, 255}, {255, 102, 255}, {255, 51, 255}, {255, 0, 255}, {255, 255, 204}, {255, 204, 204}, {255, 153, 204}, {255, 102, 204}, {255, 51, 204}, {255, 0, 204}, {255, 255, 153}, {255, 204, 153}, {255, 153, 153}, {255, 102, 153}, {255, 51, 153}, {255, 0, 153}, {204, 255, 255}, {204, 204, 255}, {204, 153, 255}, {204, 102, 255}, {204, 51, 255}, {204, 0, 255}, {204, 255, 204}, {204, 204, 204}, {204, 153, 204}, {204, 102, 204}, {204, 51, 204}, {204, 0, 204}, {204, 255, 153}, {204, 204, 153}, {204, 153, 153}, {204, 102, 153}, {204, 51, 153}, {204, 0, 153}, {153, 255, 255}, {153, 204, 255}, {153, 153, 255}, {153, 102, 255}, {153, 51, 255}, {153, 0, 255}, {153, 255, 204}, {153, 204, 204}, {153, 153, 204}, {153, 102, 204}, {153, 51, 204}, {153, 0, 204}, {153, 255, 153}, {153, 204, 153}, {153, 153, 153}, {153, 102, 153}, {153, 51, 153}, {153, 0, 153}, {102, 255, 255}, {102, 204, 255}, {102, 153, 255}, {102, 102, 255}, {102, 51, 255}, {102, 0, 255}, {102, 255, 204}, {102, 204, 204}, {102, 153, 204}, {102, 102, 204}, {102, 51, 204}, {102, 0, 204}, {102, 255, 153}, {102, 204, 153}, {102, 153, 153}, {102, 102, 153}, {102, 51, 153}, {102, 0, 153}, { 51, 255, 255}, { 51, 204, 255}, { 51, 153, 255}, { 51, 102, 255}, { 51, 51, 255}, { 51, 0, 255}, { 51, 255, 204}, { 51, 204, 204}, { 51, 153, 204}, { 51, 102, 204}, { 51, 51, 204}, { 51, 0, 204}, { 51, 255, 153}, { 51, 204, 153}, { 51, 153, 153}, { 51, 102, 153}, { 51, 51, 153}, { 51, 0, 153}, { 0, 255, 255}, { 0, 204, 255}, { 0, 153, 255}, { 0, 102, 255}, { 0, 51, 255}, { 0, 0, 255}, { 0, 255, 204}, { 0, 204, 204}, { 0, 153, 204}, { 0, 102, 204}, { 0, 51, 204}, { 0, 0, 204}, { 0, 255, 153}, { 0, 204, 153}, { 0, 153, 153}, { 0, 102, 153}, { 0, 51, 153}, { 0, 0, 153}, {255, 255, 102}, {255, 204, 102}, {255, 153, 102}, {255, 102, 102}, {255, 51, 102}, {255, 0, 102}, {255, 255, 51}, {255, 204, 51}, {255, 153, 51}, {255, 102, 51}, {255, 51, 51}, {255, 0, 51}, {255, 255, 0}, {255, 204, 0}, {255, 153, 0}, {255, 102, 0}, {255, 51, 0}, {255, 0, 0}, {204, 255, 102}, {204, 204, 102}, {204, 153, 102}, {204, 102, 102}, {204, 51, 102}, {204, 0, 102}, {204, 255, 51}, {204, 204, 51}, {204, 153, 51}, {204, 102, 51}, {204, 51, 51}, {204, 0, 51}, {204, 255, 0}, {204, 204, 0}, {204, 153, 0}, {204, 102, 0}, {204, 51, 0}, {204, 0, 0}, {153, 255, 102}, {153, 204, 102}, {153, 153, 102}, {153, 102, 102}, {153, 51, 102}, {153, 0, 102}, {153, 255, 51}, {153, 204, 51}, {153, 153, 51}, {153, 102, 51}, {153, 51, 51}, {153, 0, 51}, {153, 255, 0}, {153, 204, 0}, {153, 153, 0}, {153, 102, 0}, {153, 51, 0}, {153, 0, 0}, {102, 255, 102}, {102, 204, 102}, {102, 153, 102}, {102, 102, 102}, {102, 51, 102}, {102, 0, 102}, {102, 255, 51}, {102, 204, 51}, {102, 153, 51}, {102, 102, 51}, {102, 51, 51}, {102, 0, 51}, {102, 255, 0}, {102, 204, 0}, {102, 153, 0}, {102, 102, 0}, {102, 51, 0}, {102, 0, 0}, { 51, 255, 102}, { 51, 204, 102}, { 51, 153, 102}, { 51, 102, 102}, { 51, 51, 102}, { 51, 0, 102}, { 51, 255, 51}, { 51, 204, 51}, { 51, 153, 51}, { 51, 102, 51}, { 51, 51, 51}, { 51, 0, 51}, { 51, 255, 0}, { 51, 204, 0}, { 51, 153, 0}, { 51, 102, 0}, { 51, 51, 0}, { 51, 0, 0}, { 0, 255, 102}, { 0, 204, 102}, { 0, 153, 102}, { 0, 102, 102}, { 0, 51, 102}, { 0, 0, 102}, { 0, 255, 51}, { 0, 204, 51}, { 0, 153, 51}, { 0, 102, 51}, { 0, 51, 51}, { 0, 0, 51}, { 0, 255, 0}, { 0, 204, 0}, { 0, 153, 0}, { 0, 102, 0}, { 0, 51, 0}, { 17, 17, 17}, { 34, 34, 34}, { 68, 68, 68}, { 85, 85, 85}, {119, 119, 119}, {136, 136, 136}, {170, 170, 170}, {187, 187, 187}, {221, 221, 221}, {238, 238, 238}, {192, 192, 192}, {128, 0, 0}, {128, 0, 128}, { 0, 128, 0}, { 0, 128, 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} }; static ColorMapEntry Palm1BitColormap[] = { {255, 255, 255}, { 0, 0, 0} }; static ColorMapEntry Palm2BitColormap[] = { {255, 255, 255}, {192, 192, 192}, {128, 128, 128}, { 0, 0, 0} }; static ColorMapEntry Palm4BitColormap[] = { {255, 255, 255}, {238, 238, 238}, {221, 221, 221}, {204, 204, 204}, {187, 187, 187}, {170, 170, 170}, {153, 153, 153}, {136, 136, 136}, {119, 119, 119}, {102, 102, 102}, { 85, 85, 85}, { 68, 68, 68}, { 51, 51, 51}, { 34, 34, 34}, { 17, 17, 17}, { 0, 0, 0} }; static boolean TranscribePalmImageToJPEG ( unsigned char *image_bytes_in, int byte_count_in, FILE * outfile ) { unsigned int width; unsigned int height; unsigned int bytes_per_row; unsigned int flags; unsigned int next_depth_offset; unsigned int bits_per_pixel; unsigned int version; unsigned int transparent_index; unsigned int compression_type; unsigned int i; unsigned int j; unsigned int inval; unsigned int inbit; unsigned int mask; unsigned int incount; unsigned int palm_red_bits; unsigned int palm_green_bits; unsigned int palm_blue_bits; unsigned char* palm_ptr; unsigned char* x_ptr; unsigned char* imagedata; unsigned char* inbyte; unsigned char* rowbuf; unsigned char* lastrow; unsigned char* imagedatastart; unsigned char* palmimage; ColorMapEntry *colormap; JSAMPLE* jpeg_row; struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; JSAMPROW row_pointer[1];/* pointer to JSAMPLE row[s] */ palmimage = image_bytes_in; width = READ_BIGENDIAN_SHORT (palmimage + 0); height = READ_BIGENDIAN_SHORT (palmimage + 2); bytes_per_row = READ_BIGENDIAN_SHORT (palmimage + 4); flags = READ_BIGENDIAN_SHORT (palmimage + 6); bits_per_pixel = palmimage[8]; version = palmimage[9]; next_depth_offset = READ_BIGENDIAN_SHORT (palmimage + 10); transparent_index = palmimage[12]; compression_type = palmimage[13]; /* bytes 14 and 15 are reserved by Palm and always 0 */ #if 0 ShowWarning ("Palm image is %dx%d, %d bpp, version %d, flags 0x%x, compression %d", width, height, bits_per_pixel, version, flags, compression_type); #endif if (compression_type == PALM_COMPRESSION_PACKBITS) { ShowWarning ("Image uses packbits compression; not yet supported"); return FALSE; } else if ((compression_type != PALM_COMPRESSION_NONE) && (compression_type != PALM_COMPRESSION_RLE) && (compression_type != PALM_COMPRESSION_SCANLINE)) { ShowWarning ("Image uses unknown compression, code 0x%x", compression_type); return FALSE; } /* as of PalmOS 4.0, there are 6 different kinds of Palm pixmaps: 1, 2, or 4 bit grayscale 8-bit StaticColor using the Palm standard colormap 8-bit PseudoColor using a user-specified colormap 16-bit DirectColor using 5 bits for red, 6 for green, and 5 for blue Each of these can be compressed with one of four compression schemes, "RLE", "Scanline", "PackBits", or none. We begin by constructing the colormap. */ if (flags & PALM_HAS_COLORMAP_FLAG) { ShowWarning ("Palm images with custom colormaps are not currently supported.\n"); return FALSE; } else if (bits_per_pixel == 1) { colormap = Palm1BitColormap; imagedatastart = palmimage + 16; } else if (bits_per_pixel == 2) { colormap = Palm2BitColormap; imagedatastart = palmimage + 16; } else if (bits_per_pixel == 4) { colormap = Palm4BitColormap; imagedatastart = palmimage + 16; } else if (bits_per_pixel == 8) { colormap = Palm8BitColormap; imagedatastart = palmimage + 16; } else if (bits_per_pixel == 16 && (flags & PALM_DIRECT_COLOR_FLAG)) { colormap = NULL; palm_red_bits = palmimage[16]; palm_green_bits = palmimage[17]; palm_blue_bits = palmimage[18]; if (palm_blue_bits > 8 || palm_green_bits > 8 || palm_red_bits > 8) { ShowWarning ("Can't handle this format DirectColor image -- too wide in some color (%d:%d:%d)\n", palm_red_bits, palm_green_bits, palm_blue_bits); return FALSE; } if (bits_per_pixel > (8 * sizeof (unsigned long))) { ShowWarning ("Can't handle this format DirectColor image -- too many bits per pixel (%d)\n", bits_per_pixel); return FALSE; } imagedatastart = palmimage + 24; } else { ShowWarning ("Unknown bits-per-pixel of %d encountered.\n", bits_per_pixel); return FALSE; } /* now create the JPEG image row buffer */ jpeg_row = (JSAMPLE *) malloc (sizeof (JSAMPLE) * (width * 3)); /* Use standard JPEG error processing */ cinfo.err = jpeg_std_error (&jerr); /* Initialize the JPEG compression object. */ jpeg_create_compress (&cinfo); jpeg_stdio_dest (&cinfo, outfile); cinfo.image_width = width; /* image width and height, in pixels */ cinfo.image_height = height; cinfo.input_components = 3; /* # of color components per pixel */ cinfo.in_color_space = JCS_RGB; /* colorspace of input image */ jpeg_set_defaults (&cinfo); jpeg_set_quality (&cinfo, 100, TRUE /* limit to baseline-JPEG values */ ); row_pointer[0] = &jpeg_row[0]; jpeg_start_compress (&cinfo, TRUE); /* row by row, uncompress the Palm image and copy it to the JPEG buffer */ rowbuf = (unsigned char *) malloc (bytes_per_row * width); lastrow = (unsigned char *) malloc (bytes_per_row * width); for (i = 0, palm_ptr = imagedatastart, x_ptr = imagedata; i < height; ++i) { /* first, uncompress the Palm image */ if ((flags & PALM_IS_COMPRESSED_FLAG) && (compression_type == PALM_COMPRESSION_RLE)) { for (j = 0; j < bytes_per_row;) { incount = *palm_ptr++; inval = *palm_ptr++; memset (rowbuf + j, inval, incount); j += incount; } } else if ((flags & PALM_IS_COMPRESSED_FLAG) && (compression_type == PALM_COMPRESSION_SCANLINE)) { for (j = 0; j < bytes_per_row; j += 8) { incount = *palm_ptr++; inval = ((bytes_per_row - j) < 8) ? (bytes_per_row - j) : 8; for (inbit = 0; inbit < inval; inbit += 1) { if (incount & (1 << (7 - inbit))) rowbuf[j + inbit] = *palm_ptr++; else rowbuf[j + inbit] = lastrow[j + inbit]; } } memcpy (lastrow, rowbuf, bytes_per_row); } else if (((flags & PALM_IS_COMPRESSED_FLAG) && (compression_type == PALM_COMPRESSION_NONE)) || (flags && PALM_IS_COMPRESSED_FLAG) == 0) { memcpy (rowbuf, palm_ptr, bytes_per_row); palm_ptr += bytes_per_row; } /* next, write it to the GDK bitmap */ if (colormap) { mask = (1 << bits_per_pixel) - 1; for (inbit = 8 - bits_per_pixel, inbyte = rowbuf, j = 0; j < width; ++j) { inval = ((*inbyte) & (mask << inbit)) >> inbit; /* correct for oddity of the 8-bit color Palm pixmap... */ if ((bits_per_pixel == 8) && (inval == 0xFF)) inval = 231; /* now lookup the correct color and set the pixel in the GTK bitmap */ jpeg_row[(j * 3) + 0] = colormap[inval].red; jpeg_row[(j * 3) + 1] = colormap[inval].green; jpeg_row[(j * 3) + 2] = colormap[inval].blue; if (!inbit) { ++inbyte; inbit = 8 - bits_per_pixel; } else { inbit -= bits_per_pixel; } } } else if (!colormap && bits_per_pixel == 16) { for (inbyte = rowbuf, j = 0; j < width; ++j) { inval = (inbyte[0] << 8) | inbyte[1]; #if 0 ShowWarning ("pixel is %d,%d (%02x:%02x:%02x)", j, i, (inval >> (bits_per_pixel - palm_red_bits)) & ((1 << palm_red_bits) - 1), (inval >> palm_blue_bits) & ((1 << palm_green_bits) - 1), (inval >> 0) & ((1 << palm_blue_bits) - 1)); #endif jpeg_row[(j * 3) + 0] = (inval >> (bits_per_pixel - palm_red_bits)) & ((1 << palm_red_bits) - 1); jpeg_row[(j * 3) + 1] = (inval >> palm_blue_bits) & ((1 << palm_green_bits) - 1); jpeg_row[(j * 3) + 2] = (inval >> 0) & ((1 << palm_blue_bits) - 1); inbyte += 2; } } (void) jpeg_write_scanlines (&cinfo, row_pointer, 1); } free (rowbuf); free (lastrow); free (jpeg_row); jpeg_finish_compress (&cinfo); jpeg_destroy_compress (&cinfo); return TRUE; } static boolean TranscribeImageRecord ( plkr_Document* doc, int id, FILE* fp, unsigned char* bytes, int len, plkr_DataRecordType type ) { return TranscribePalmImageToJPEG (bytes + 8, len - 8, fp); } typedef struct { unsigned int width; unsigned int height; unsigned int bytes_per_row; unsigned int flags; unsigned int next_depth_offset; unsigned int bits_per_pixel; unsigned int version; unsigned int transparent_index; unsigned int compression_type; unsigned int palm_red_bits; unsigned int palm_green_bits; unsigned int palm_blue_bits; unsigned char* bytes; } PALMPIX; static boolean TranscribeMultiImageRecord ( plkr_Document* doc, int id, FILE* fp, unsigned char* bytes, int len, plkr_DataRecordType type ) { unsigned char* pbytes; unsigned char* outbytes; unsigned char* outptr; unsigned char* ptr = &bytes[12]; plkr_DataRecordType ptype; PALMPIX* cells; PALMPIX* acell; unsigned int record_id; unsigned int plen; unsigned int x; unsigned int y; unsigned int cols; unsigned int rows; unsigned int width; unsigned int height; unsigned int bytes_per_row; unsigned int flags; unsigned int bits_per_pixel; unsigned int version; unsigned int transparent_index; unsigned int compression_type; unsigned int palm_red_bits; unsigned int palm_green_bits; unsigned int palm_blue_bits; unsigned int outlen; unsigned int offset; boolean status; cols = (bytes[8] << 8) + bytes[9]; rows = (bytes[10] << 8) + bytes[11]; cells = (PALMPIX *) calloc (cols * rows, sizeof (PALMPIX)); height = 0; for (y = 0; y < rows; y++) { width = 0; bytes_per_row = 0; for (x = 0; x < cols; x++) { acell = &CELLS (y, x); record_id = (ptr[0] << 8) + ptr[1]; ptr += 2; pbytes = plkr_GetRecordBytes (doc, record_id, &plen, &ptype); if (pbytes == NULL) { free (cells); return FALSE; } pbytes += 8; acell->width = READ_BIGENDIAN_SHORT (&pbytes[0]); width += acell->width; acell->height = READ_BIGENDIAN_SHORT (&pbytes[2]); acell->bytes_per_row = READ_BIGENDIAN_SHORT (&pbytes[4]); bytes_per_row += acell->bytes_per_row; acell->flags = READ_BIGENDIAN_SHORT (&pbytes[6]); flags = acell->flags; acell->bits_per_pixel = pbytes[8]; bits_per_pixel = acell->bits_per_pixel; acell->version = pbytes[9]; version = acell->version; acell->next_depth_offset = READ_BIGENDIAN_SHORT (&pbytes[10]); acell->transparent_index = pbytes[12]; transparent_index = acell->transparent_index; acell->compression_type = pbytes[13]; compression_type = acell->compression_type; if (acell->flags & PALM_HAS_COLORMAP_FLAG) { ShowWarning ("Palm images with custom colormaps are not currently supported.\n"); free (cells); return FALSE; } acell->bytes = pbytes + 16; offset = 16; if (acell->bits_per_pixel == 16 && (acell->flags & PALM_DIRECT_COLOR_FLAG)) { acell->palm_red_bits = pbytes[16]; palm_red_bits = acell->palm_red_bits; acell->palm_green_bits = pbytes[17]; palm_green_bits = acell->palm_green_bits; acell->palm_blue_bits = pbytes[18]; palm_blue_bits = acell->palm_blue_bits; acell->bytes = pbytes + 24; offset = 24; } } height += acell->height; } outlen = bytes_per_row * height + offset; outbytes = (unsigned char *) malloc (outlen); outptr = outbytes; *outptr++ = width >> 8; *outptr++ = width; *outptr++ = height >> 8; *outptr++ = height; *outptr++ = bytes_per_row >> 8; *outptr++ = bytes_per_row; *outptr++ = flags >> 8; *outptr++ = flags; *outptr++ = bits_per_pixel; *outptr++ = version; *outptr++ = 0; /* next_depth_offset */ *outptr++ = 0; *outptr++ = transparent_index; *outptr++ = compression_type; *outptr++ = 0; *outptr++ = 0; if (acell->bits_per_pixel == 16 && (acell->flags & PALM_DIRECT_COLOR_FLAG)) { *outptr++ = palm_red_bits; *outptr++ = palm_green_bits; *outptr++ = palm_blue_bits; *outptr++ = 0; *outptr++ = 0; *outptr++ = 0; *outptr++ = 0; *outptr++ = 0; } for (y = 0; y < rows; y++) { int i, h; acell = &CELLS (y, 0); h = acell->height; for (i = 0; i < h; i++) { for (x = 0; x < cols; x++) { acell = &CELLS (y, x); memcpy (outptr, acell->bytes, acell->bytes_per_row); acell->bytes += acell->bytes_per_row; outptr += acell->bytes_per_row; } } } status = TranscribePalmImageToJPEG (outbytes, outlen, fp); free (outbytes); free (cells); return status; } static void DoStyle ( FILE* fp, int style, boolean start ) { char end[2]; if (start) strcpy (end, ""); else strcpy (end, "/"); switch (style) { case 1: fprintf (fp, "<%sH1>", end); break; case 2: fprintf (fp, "<%sH2>", end); break; case 3: fprintf (fp, "<%sH3>", end); break; case 4: fprintf (fp, "<%sH4>", end); break; case 5: fprintf (fp, "<%sH5>", end); break; case 6: fprintf (fp, "<%sH6>", end); break; case 7: fprintf (fp, "<%sB>", end); break; case 8: fprintf (fp, "<%sTT>", end); break; } } static boolean TranscribeTableRecord ( plkr_Document* doc, int id, FILE* fp, unsigned char* bytes, int len, plkr_DataRecordType type ); static void ParseText ( plkr_Document* doc, unsigned char* ptr, int text_len, int* font, long* text_color, int* style, FILE* fp ) { unsigned char* end; int fctype; int fclen; end = ptr + text_len; while (ptr < end) { if (ptr[0]) { fprintf (fp, "%s", ptr); ptr += strlen (ptr); } else { fctype = GET_FUNCTION_CODE_TYPE (ptr[1]); fclen = 2 + GET_FUNCTION_CODE_DATALEN (ptr[1]); switch (fctype) { case PLKR_TFC_LINK: switch (fclen) { case 4: /* ANCHOR_BEGIN */ { int record_id = (ptr[2] << 8) + ptr[3]; plkr_DataRecordType type = plkr_GetRecordType (doc, record_id); if (type == PLKR_DRTYPE_IMAGE || type == PLKR_DRTYPE_IMAGE_COMPRESSED) fprintf (fp, "", record_id); else fprintf (fp, "", record_id); AddRecord (record_id); } break; case 2: /* ANCHOR_END */ fprintf (fp, ""); break; } ptr += fclen; break; case PLKR_TFC_FONT: DoStyle (fp, *style, FALSE); *style = ptr[2]; DoStyle (fp, *style, TRUE); ptr += fclen; break; case PLKR_TFC_NEWLINE: fprintf (fp, "
\n"); ptr += fclen; break; case PLKR_TFC_BITALIC: fprintf (fp, ""); ptr += fclen; break; case PLKR_TFC_EITALIC: fprintf (fp, ""); ptr += fclen; break; case PLKR_TFC_COLOR: if (*font) { *font--; fprintf (fp, ""); } *text_color = (ptr[2] << 16) + (ptr[3] << 8) + ptr[4]; fprintf (fp, "", *text_color); *font++; ptr += fclen; break; case PLKR_TFC_BULINE: fprintf (fp, ""); ptr += fclen; break; case PLKR_TFC_EULINE: fprintf (fp, ""); ptr += fclen; break; case PLKR_TFC_BSTRIKE: fprintf (fp, ""); ptr += fclen; break; case PLKR_TFC_ESTRIKE: fprintf (fp, ""); ptr += fclen; break; case PLKR_TFC_TABLE: if (fclen == 4) { int record_id, datalen; plkr_DataRecordType type = 0; unsigned char *bytes = NULL; record_id = (ptr[2] << 8) + ptr[3]; bytes = plkr_GetRecordBytes (doc, record_id, &datalen, &type); TranscribeTableRecord (doc, record_id, fp, bytes, datalen, type); } ptr += fclen; break; default: ptr += fclen; } } } } static boolean TranscribeTableRecord ( plkr_Document* doc, int id, FILE* fp, unsigned char* bytes, int len, plkr_DataRecordType type ) { unsigned char* ptr = &bytes[24]; unsigned char* end; unsigned char* text_end; char* align_names[] = { "left", "right", "center" }; boolean in_row = FALSE; int x; int y; int cols; int size; int rows; int border; int record_id; int align; int text_len; int colspan; int rowspan; int font = 0; int style = 0; int fctype; int fclen; long border_color; long link_color; long text_color = 0; size = (bytes[8] << 8) + bytes[9]; cols = (bytes[10] << 8) + bytes[11]; rows = (bytes[12] << 8) + bytes[13]; border = bytes[15]; border_color = (bytes[17] << 16) + (bytes[18] << 8) + (bytes[19] << 8); link_color = (bytes[21] << 16) + (bytes[22] << 8) + (bytes[23] << 8); end = ptr + size - 1; fprintf (fp, "\n", border, border_color, link_color); while (ptr < end) { if (ptr[0] == '\0') { fctype = GET_FUNCTION_CODE_TYPE (ptr[1]); fclen = 2 + GET_FUNCTION_CODE_DATALEN (ptr[1]); switch (fctype) { case PLKR_TFC_TABLE: switch (fclen) { case 2: /* NEW_ROW */ if (in_row) fprintf (fp, "\n"); fprintf (fp, "\n"); in_row = TRUE; ptr += fclen; break; case 9: /* NEW_CELL */ align = ptr[2]; colspan = ptr[5]; rowspan = ptr[6]; fprintf (fp, "\n"); break; default: ptr += fclen; } break; default: ptr += fclen; } } else { fprintf (fp, "
", align_names[align], colspan, rowspan, border_color); if (record_id = READ_BIGENDIAN_SHORT (&ptr[3])) { fprintf (fp, "", record_id); AddRecord (record_id); } DoStyle (fp, style, TRUE); text_len = READ_BIGENDIAN_SHORT (&ptr[7]); ptr += fclen; ParseText (doc, ptr, text_len, &font, &text_color, &style, fp); ptr += text_len; DoStyle (fp, style, FALSE); fprintf (fp, "
\n"); return FALSE; } } fprintf (fp, "\n"); return TRUE; } typedef struct { int size; int attributes; } ParagraphInfo; static ParagraphInfo *ParseParagraphInfo ( unsigned char* bytes, int len, int* nparas ) { ParagraphInfo* paragraph_info; int j; int n; n = (bytes[2] << 8) + bytes[3]; paragraph_info = (ParagraphInfo *) malloc (sizeof (ParagraphInfo) * n); for (j = 0; j < n; j++) { paragraph_info[j].size = (bytes[8 + (j * 4) + 0] << 8) + bytes[8 + (j * 4) + 1]; paragraph_info[j].attributes = (bytes[8 + (j * 4) + 2] << 8) + bytes[8 + (j * 4) + 3]; } *nparas = n; return paragraph_info; } static boolean TranscribeTextRecord ( plkr_Document* doc, int id, FILE* fp, unsigned char* bytes, int len, plkr_DataRecordType type ) { unsigned char* ptr; unsigned char* run; unsigned char* para_start; unsigned char* data; unsigned char* start; ParagraphInfo* paragraphs; boolean first_record_of_page = TRUE; boolean current_link; boolean current_italic; boolean current_struckthrough; boolean current_underline; int home_id = plkr_GetHomeRecordID (doc); int fctype; int fclen; int para_index; int para_len; int textlen; int data_len; int current_font; int record_index; int current_alignment; int current_left_margin; int current_right_margin; int nparagraphs; long current_color; record_index = id; fprintf (fp, "\n%s", plkr_GetName (doc)); if (id != home_id) fprintf (fp, ": %d\n", id); fprintf (fp, "\n"); if (home_id == id) { char *url = plkr_GetRecordURL (doc, id); if (url) fprintf (fp, "\n", url); } fprintf (fp, "\n\n"); paragraphs = ParseParagraphInfo (bytes, len, &nparagraphs); start = bytes + 8 + ((bytes[2] << 8) + bytes[3]) * 4; for (para_index = 0, ptr = start, run = start; para_index < nparagraphs; para_index++) { para_len = paragraphs[para_index].size; /* If the paragraph is the last in the record, and it consists of a link to the next record in the logical page, we trim off the paragraph and instead insert the whole page */ if (((para_index + 1) == nparagraphs) && (para_len == (sizeof ("Click here for the next part") + 5)) && (*ptr == 0) && (ptr[1] == ((PLKR_TFC_LINK << 3) + 2)) && (strcmp (ptr + 4, "Click here for the next part") == 0)) { record_index = (ptr[2] << 8) + ptr[3]; if ((data = plkr_GetRecordBytes (doc, record_index, &data_len, &type)) == NULL) { ShowWarning ("Can't open record %d!", record_index); return FALSE; } else if (!(type == PLKR_DRTYPE_TEXT_COMPRESSED || type == PLKR_DRTYPE_TEXT)) { ShowWarning ("Bad record type %d in record linked from end of record %d", type, id); return FALSE; } first_record_of_page = FALSE; para_index = 0; ptr = data + 8 + ((data[2] << 8) + data[3]) * 4; run = ptr; free (paragraphs); paragraphs = ParseParagraphInfo (data, data_len, &nparagraphs); para_len = paragraphs[para_index].size; MarkRecordDone (record_index); SetPageID (record_index, id); } if ((para_index == 0) && !first_record_of_page && (*ptr == 0) && (ptr[1] == ((PLKR_TFC_LINK << 3) + 2)) && (strcmp (ptr + 4, "Click here for the previous part") == 0)) { /* throw away this inserted paragraph */ ptr += para_len; run = ptr; continue; } fprintf (fp, "

", (paragraphs[para_index].attributes & 0x7) * 2, record_index, para_index); current_link = FALSE; /* at the beginning of a paragraph, we start with a clean graphics context */ current_font = 0; current_alignment = 0; current_color = 0; current_italic = FALSE; current_underline = FALSE; current_struckthrough = FALSE; current_left_margin = 0; current_right_margin = 0; for (para_start = ptr, textlen = 0; (ptr - para_start) < para_len;) { if (*ptr == 0) { /* function code */ if ((ptr - run) > 0) { /* write out any pending text */ fwrite (run, 1, (ptr - run), fp); textlen += (ptr - run); } ptr++; fctype = GET_FUNCTION_CODE_TYPE (*ptr); fclen = GET_FUNCTION_CODE_DATALEN (*ptr); ptr++; if (fctype == PLKR_TFC_NEWLINE) { fprintf (fp, "
\n"); } else if (fctype == PLKR_TFC_LINK) { int record_id, real_record_id, datalen; plkr_DataRecordType type = 0; unsigned char *bytes = NULL; char *url = NULL; if (fclen == 0) { if (current_link) fprintf (fp, ""); current_link = FALSE; } else { record_id = (ptr[0] << 8) + ptr[1]; bytes = plkr_GetRecordBytes (doc, record_id, &datalen, &type); if (!bytes) { url = plkr_GetRecordURL (doc, record_id); } if (bytes && (type == PLKR_DRTYPE_MAILTO)) { url = MailtoURLFromBytes (bytes, datalen); fprintf (fp, "", url); free (url); current_link = TRUE; } else if (!bytes && url) { fprintf (fp, "", url); current_link = TRUE; } else if (bytes && (fclen == 2)) { AddRecord (record_id); real_record_id = GetPageID (record_id); if (type == PLKR_DRTYPE_IMAGE || type == PLKR_DRTYPE_IMAGE_COMPRESSED) { fprintf (fp, "", real_record_id); } else { fprintf (fp, "", real_record_id); } current_link = TRUE; } else if (bytes && (fclen == 4)) { AddRecord (record_id); real_record_id = GetPageID (record_id); fprintf (fp, " ", real_record_id, record_id, (ptr[2] << 8) + ptr[3]); current_link = TRUE; } else { ShowWarning ("odd link found: record_id=%d, bytes=0x%p, type=%d, url=%s", record_id, bytes, type, (url ? url : "0x0")); } } } else if (fctype == PLKR_TFC_FONT) { fprintf (fp, "", current_font, *ptr); if (current_font != *ptr) { if (current_font == 1) { fprintf (fp, ""); } else if (current_font == 2) { fprintf (fp, ""); } else if (current_font == 3) { fprintf (fp, ""); } else if (current_font == 4) { fprintf (fp, ""); } else if (current_font == 5) { fprintf (fp, ""); } else if (current_font == 6) { fprintf (fp, ""); } else if (current_font == 7) { fprintf (fp, ""); } else if (current_font == 8) { fprintf (fp, ""); } else if (current_font == 11) { fprintf (fp, ""); } if (*ptr == 1) { fprintf (fp, "

"); } else if (*ptr == 2) { fprintf (fp, "

"); } else if (*ptr == 3) { fprintf (fp, "

"); } else if (*ptr == 4) { fprintf (fp, "

"); } else if (*ptr == 5) { fprintf (fp, "

"); } else if (*ptr == 6) { fprintf (fp, "
"); } else if (*ptr == 7) { fprintf (fp, ""); } else if (*ptr == 8) { fprintf (fp, ""); } else if (*ptr == 11) { fprintf (fp, ""); } current_font = *ptr; } } else if (fctype == PLKR_TFC_BITALIC) { fprintf (fp, ""); current_italic = TRUE; } else if (fctype == PLKR_TFC_EITALIC) { if (current_italic) { fprintf (fp, ""); current_italic = FALSE; } } else if (fctype == PLKR_TFC_BULINE) { fprintf (fp, ""); current_underline = TRUE; } else if (fctype == PLKR_TFC_EULINE) { if (current_underline) { fprintf (fp, ""); current_underline = FALSE; } } else if (fctype == PLKR_TFC_BSTRIKE) { fprintf (fp, ""); current_struckthrough = TRUE; } else if (fctype == PLKR_TFC_ESTRIKE) { if (current_struckthrough) { fprintf (fp, ""); current_struckthrough = FALSE; } } else if (fctype == PLKR_TFC_HRULE) { fprintf (fp, "
\n", ptr[2]); else if (ptr[1] > 0 && ptr[2] == 0) fprintf (fp, "%d>\n", ptr[1]); else fprintf (fp, "\"100%%\">"); } else if (fctype == PLKR_TFC_ALIGN) { if (current_alignment > 0) fprintf (fp, ""); current_alignment = 0; if (*ptr < 4) { fprintf (fp, "
"); current_alignment = (*ptr) + 1; } } else if (fctype == PLKR_TFC_MARGINS) { /* Not easy to set, in HTML */ fprintf (fp, "", ptr[0], ptr[1]); #if 0 if (current_left_margin != ptr[0] || current_right_margin != ptr[1]) { if (current_right_margin != 0) fprintf (fp, " ", current_right_margin); fprintf (fp, "\n"); } current_left_margin = ptr[0]; current_right_margin = ptr[1]; if (current_right_margin > 0 || current_left_margin > 0) { fprintf (fp, ""); if (current_left_margin != 0) { fprintf (fp, ""); } fprintf (fp, "
", current_left_margin); if ((ptr - run) > 2) { fwrite (run, 1, ((ptr - 2) - run), fp); textlen += ((ptr - 2) - run); } else { fprintf (fp, " "); } fprintf (fp, ""); if (current_left_margin == 0 && (ptr - run) > 2) { fwrite (run, 1, ((ptr - 2) - run), fp); textlen += ((ptr - 2) - run); } } else { if ((ptr - run) > 2) { fwrite (run, 1, ((ptr - 2) - run), fp); textlen += ((ptr - 2) - run); } } #endif current_left_margin = ptr[0]; current_right_margin = ptr[1]; } else if (fctype == PLKR_TFC_COLOR) { /* not sure what to do here yet */ fprintf (fp, "", ptr[0], ptr[1], ptr[2]); current_color = (ptr[0] << 16) + (ptr[1] << 8) + ptr[2]; } else if (fctype == PLKR_TFC_IMAGE || fctype == PLKR_TFC_IMAGE2) { fprintf (fp, "", (ptr[0] << 8) + ptr[1]); AddRecord ((ptr[0] << 8) + ptr[1]); } else if (fctype == PLKR_TFC_TABLE) { int record_id, datalen; plkr_DataRecordType type = 0; unsigned char *bytes = NULL; record_id = (ptr[0] << 8) + ptr[1]; bytes = plkr_GetRecordBytes (doc, record_id, &datalen, &type); TranscribeTableRecord (doc, record_id, fp, bytes, datalen, type); } else if (fctype == PLKR_TFC_UCHAR) { if (fclen == 3) fprintf (fp, "&#%d;", (ptr[1] << 8) + ptr[2]); else if (fclen == 5) fprintf (fp, "&#%d;", (ptr[3] << 8) + ptr[4]); /* skip over alternate text */ ptr += ptr[0]; } else { /* ignore function */ fprintf (fp, "", fctype); } ptr += fclen; run = ptr; } else { ptr++; } } if ((ptr - run) > 0) { /* output any pending text at the end of the paragraph */ fwrite (run, 1, (ptr - run), fp); textlen += (ptr - run); run = ptr; } if (current_link) fprintf (fp, ""); /* clear the graphics state again */ if (current_font == 1) { fprintf (fp, ""); } else if (current_font == 2) { fprintf (fp, ""); } else if (current_font == 3) { fprintf (fp, ""); } else if (current_font == 4) { fprintf (fp, ""); } else if (current_font == 5) { fprintf (fp, ""); } else if (current_font == 6) { fprintf (fp, ""); } else if (current_font == 7) { fprintf (fp, ""); } else if (current_font == 8) { fprintf (fp, ""); } if (current_italic) fprintf (fp, ""); if (current_underline) fprintf (fp, ""); if (current_struckthrough) fprintf (fp, ""); if (current_alignment > 0) fprintf (fp, ""); #if 0 if (current_right_margin > 0) fprintf (fp, " 
", current_right_margin); else if (current_left_margin > 0) fprintf (fp, ""); #endif /* end the paragraph */ fprintf (fp, "

\n"); } free (paragraphs); fprintf (fp, "\n"); return TRUE; } static boolean TranscribeRecord ( plkr_Document* doc, char* dir, int record_index ) { plkr_DataRecordType type; unsigned char* data; char* filename; int data_len; FILE* fp; boolean status = TRUE; filename = (char *) malloc (strlen (dir) + 20); if ((data = plkr_GetRecordBytes (doc, record_index, &data_len, &type)) == NULL) { free (filename); return FALSE; } if ((type == PLKR_DRTYPE_TEXT_COMPRESSED) || (type == PLKR_DRTYPE_TEXT)) { sprintf (filename, "%s/r%d.html", dir, record_index); } else if ((type == PLKR_DRTYPE_IMAGE_COMPRESSED) || (type == PLKR_DRTYPE_IMAGE)) { sprintf (filename, "%s/r%d.jpg", dir, record_index); } else if ((type == PLKR_DRTYPE_MULTIIMAGE) || (type == PLKR_DRTYPE_IMAGE)) { sprintf (filename, "%s/r%d.jpg", dir, record_index); } if (type == PLKR_DRTYPE_TEXT_COMPRESSED || type == PLKR_DRTYPE_TEXT) { fp = fopen (filename, "w+"); if (!fp) { free (filename); return FALSE; } status = TranscribeTextRecord (doc, record_index, fp, data, data_len, type); } else if (type == PLKR_DRTYPE_IMAGE_COMPRESSED || type == PLKR_DRTYPE_IMAGE) { fp = fopen (filename, "wb+"); if (!fp) { free (filename); return FALSE; } status = TranscribeImageRecord (doc, record_index, fp, data, data_len, type); } else if (type == PLKR_DRTYPE_MULTIIMAGE) { fp = fopen (filename, "wb+"); if (!fp) { free (filename); return FALSE; } TranscribeMultiImageRecord (doc, record_index, fp, data, data_len, type); status = FALSE; } else { fprintf (stderr, "Invalid record type %d for record %d\n", type, record_index); status = FALSE; } fclose (fp); if (status && (record_index == plkr_GetHomeRecordID (doc))) { char *symlinkname = (char *) malloc (strlen (dir) + 20); sprintf (symlinkname, "%s/default.html", dir); link (filename, symlinkname); free (symlinkname); } MarkRecordDone (record_index); free (filename); return status; } static void FinishDoc ( plkr_Document* doc ) { RecordNode* ptr; while (records != NULL) { ptr = records; records = ptr->next; free (ptr); } plkr_CloseDoc (doc); } int main ( int ac, char** av, char** envp ) { plkr_Document* doc; int i; struct stat buf; char* document_path; char* directory = NULL; char* owner_id = NULL; boolean verbose = 0; boolean status; char* usage_format = "Usage: %s [--directory=DIR] [--verbose] DOCUMENT-FILE\n"; for (i = 1; i < ac; i++) { if (strncmp (av[i], "--directory=", 12) == 0) { directory = av[i] + 12; } else if (strncmp (av[i], "--verbose", 9) == 0) { verbose = 1; } else if (strncmp (av[i], "--", 2) == 0) { fprintf (stderr, usage_format, av[0]); return 1; } else { break; } } if ((ac - i) != 1) { fprintf (stderr, usage_format, av[0]); return 1; } document_path = av[i]; if (directory == NULL) { directory = tmpnam ((char *) malloc (L_tmpnam)); } if (stat (directory, &buf) != 0) { /* assume it doesn't exist */ if (mkdir (directory, 0775) != 0) { fprintf (stderr, "Can't create directory %s\n", directory); return 1; } } else if (!S_ISDIR (buf.st_mode)) { fprintf (stderr, "Specified directory %s is not a directory!\n", directory); return 1; } if (stat (document_path, &buf) != 0) { fprintf (stderr, "Can't access document %s\n", document_path); return 1; } else if (!S_ISREG (buf.st_mode)) { fprintf (stderr, "Document file %s must be a regular file.\n", document_path); return 1; } plkr_ShowMessages (verbose); doc = plkr_OpenDBFile (document_path); if (!doc) { fprintf (stderr, "Error opening document %s\n", document_path); return 1; } AddRecord (plkr_GetHomeRecordID (doc)); i = GetNextRecordNumber (); while (i > 0) { status = TranscribeRecord (doc, directory, i); i = GetNextRecordNumber (); } LinkRecords (directory); FinishDoc (doc); if (ac < 3) printf ("%s\n", directory); return (!status); } plucker-1.8/tools/explode/Makefile.in0100644000076400001440000000336007713213406016715 0ustar mickeusers# # $Id: Makefile.in,v 1.7 2003/08/03 14:07:02 nordstrom Exp $ # SHELL = @SHELL@ top_builddir = ../.. subdir = tools/explode srcdir = @srcdir@ VPATH = @srcdir@ DESTDIR = BINDIR = $(DESTDIR)@bindir@ DATADIR = $(DESTDIR)@PLUCKERDIR@ UNPLUCK_DIR = $(top_builddir)/tools/unpluck LIBS = @LIBS@ CPPFLAGS = @CPPFLAGS@ -I$(UNPLUCK_DIR) CFLAGS = @CFLAGS@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ MKINSTALLDIRS = $(top_builddir)/mkinstalldirs TARGET = explode SOURCES = explode.c OBJECTS = ${SOURCES:.c=.o} $(UNPLUCK_DIR)/libunpluck.a all: $(TARGET) explode.o : explode.c $(UNPLUCK_DIR)/unpluck.h $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $(srcdir)/$*.c Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status $(TARGET): $(OBJECTS) $(CC) -o $(TARGET) $(OBJECTS) $(LIBS) depend: $(SOURCES) here=`pwd`; cd $(srcdir) && $(CC) -MM $(SOURCES) > $$here/.depend .depend: $(SOURCES) here=`pwd`; cd $(srcdir) && $(CC) -MM $(SOURCES) > $$here/.depend tags: $(SOURCES) *.h here=`pwd`; cd $(srcdir) && $(CTAGS) -o $$here/tags $(SOURCES) *.h install: $(MKINSTALLDIRS) $(BINDIR) $(INSTALL_PROGRAM) $(TARGET) $(BINDIR) clean: rm -f *.o core .depend $(TARGET) distclean: clean rm -f Makefile netscape4-plucker-helper maintainer-clean: distclean @echo "------------------------------------------------------------" @echo "This command is intended for maintainers to use..." @echo "it deletes files that may require special tools to rebuild." @echo "------------------------------------------------------------" plucker-1.8/tools/Makefile.in0100644000076400001440000000326307713213406015257 0ustar mickeusers# # $Id: Makefile.in,v 1.5 2003/08/03 14:07:02 nordstrom Exp $ # SHELL = @SHELL@ top_builddir = .. subdir = tools srcdir = @srcdir@ VPATH = @srcdir@ DESTDIR = PLUCK_COMICSDIR = pluck-comics EXPLODEDIR = explode UNPLUCKDIR = unpluck MKINSTALLDIRS = $(top_builddir)/mkinstalldirs all: pluck_comics unpluck_lib explode_app Makefile: Makefile.in $(top_builddir)/config.status cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status pluck_comics: cd $(PLUCK_COMICSDIR) ; $(MAKE) explode_app: cd $(EXPLODEDIR) ; $(MAKE) unpluck_lib: cd $(UNPLUCKDIR) ; $(MAKE) install: install-pluck_comics install-explode_app install-unpluck_lib install-pluck_comics: cd $(PLUCK_COMICSDIR) ; $(MAKE) install install-explode_app: cd $(EXPLODEDIR) ; $(MAKE) install install-unpluck_lib: cd $(UNPLUCKDIR) ; $(MAKE) install clean-recursive: cd $(PLUCK_COMICSDIR) ; $(MAKE) clean cd $(EXPLODEDIR) ; $(MAKE) clean cd $(UNPLUCKDIR) ; $(MAKE) clean distclean-recursive: cd $(PLUCK_COMICSDIR) ; $(MAKE) distclean cd $(EXPLODEDIR) ; $(MAKE) distclean cd $(UNPLUCKDIR) ; $(MAKE) distclean maintainer-clean-recursive: cd $(PLUCK_COMICSDIR) ; $(MAKE) maintainer-clean cd $(EXPLODEDIR) ; $(MAKE) maintainer-clean cd $(UNPLUCKDIR) ; $(MAKE) maintainer-clean clean: clean-recursive distclean: clean distclean-recursive rm -f Makefile maintainer-clean: distclean maintainer-clean-recursive @echo "------------------------------------------------------------" @echo "This command is intended for maintainers to use..." @echo "it deletes files that may require special tools to rebuild." @echo "------------------------------------------------------------" plucker-1.8/tools/plucker-conduit/0040755000076400001440000000000010052665032016315 5ustar mickeusersplucker-1.8/tools/plucker-conduit/msw/0040755000076400001440000000000010052665033017124 5ustar mickeusersplucker-1.8/tools/plucker-conduit/msw/PluckerCondGenCond.h0100644000076400001440000000147607621473073022762 0ustar mickeusers/***************************************************************************** * * Generic Conduit Export Functions Header File * ****************************************************************************/ #ifndef __GENERIC_MAIN_CONDUIT__ #define __GENERIC_MAIN_CONDUIT__ #include #define GENERIC_CONDUIT_VERSION 0x00000102 #ifndef ExportFunc #ifdef _68K_ #define ExportFunc #else #define ExportFunc __declspec( dllexport ) #endif #endif extern "C" { typedef long (*PROGRESSFN) (char*); ExportFunc long OpenConduit(PROGRESSFN, CSyncProperties&); ExportFunc long GetConduitName(char*,WORD); ExportFunc DWORD GetConduitVersion(); ExportFunc long ConfigureConduit(CSyncPreference& pref); ExportFunc long GetConduitInfo(ConduitInfoEnum infoType, void *pInArgs, void *pOut, DWORD *dwOutSize); }; #endif plucker-1.8/tools/plucker-conduit/msw/PluckerCond.dsp0100644000076400001440000001232507774437364022072 0ustar mickeusers# Microsoft Developer Studio Project File - Name="PluckerCond" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=PluckerCond - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "PluckerCond.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "PluckerCond.mak" CFG="PluckerCond - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "PluckerCond - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "PluckerCond - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "PluckerCond - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PLUCKERCOND_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /GX /O2 /I ".\\" /I "D:\CDK403\c++\include" /I "D:\CDK403\c++\samples\gencns\gencn\include" /I "D:\CDK403\c++\pfc\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PLUCKERCOND_EXPORTS" /D "_NOMFC" /D "_CONDUIT_" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib sync20.lib hslog20.lib palmcmn.lib condmgr.lib userdata.lib comctl32.lib /nologo /dll /machine:I386 /libpath:"c:\palmdev\cdk403\c++\lib" !ELSEIF "$(CFG)" == "PluckerCond - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PLUCKERCOND_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I ".\\" /I "D:\CDK403\c++\include" /I "D:\CDK403\c++\samples\gencns\gencn\include" /I "D:\CDK403\c++\pfc\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PLUCKERCOND_EXPORTS" /D "_NOMFC" /D "_CONDUIT_" /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib sync20.lib hslog20.lib palmcmn.lib condmgr.lib userdata.lib comctl32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"D:\CDK403\c++\lib" # SUBTRACT LINK32 /pdb:none !ENDIF # Begin Target # Name "PluckerCond - Win32 Release" # Name "PluckerCond - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=.\PluckerCondGenCond.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=.\PluckerCondGenCond.h # End Source File # Begin Source File SOURCE=.\resource.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # Begin Source File SOURCE=.\r_englsh\PluckerCond.rc # End Source File # Begin Source File SOURCE=.\r_englsh\Res\Sync0.bmp # End Source File # Begin Source File SOURCE=.\r_englsh\Res\Sync1.bmp # End Source File # Begin Source File SOURCE=.\r_englsh\Res\Sync2.bmp # End Source File # Begin Source File SOURCE=.\r_englsh\Res\Sync3.bmp # End Source File # End Group # Begin Source File SOURCE=.\Building_ms_visual_c.txt # End Source File # Begin Source File SOURCE=.\changelog.txt # End Source File # Begin Source File SOURCE=.\COPYING # End Source File # Begin Source File SOURCE=.\readme.txt # End Source File # End Target # End Project plucker-1.8/tools/plucker-conduit/msw/PluckerCond.dsw0100644000076400001440000000100407621473073022055 0ustar mickeusersMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "PluckerCond"=.\PluckerCond.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### plucker-1.8/tools/plucker-conduit/msw/PluckerCond.iss0100644000076400001440000000324607621473073022070 0ustar mickeusers; ; Setup script for the Plucker Conduit ; Bill Nalen ; January 31, 2003 [Setup] AppName=Plucker Conduit for Windows AppVerName=Plucker Conduit for Windows 0.1.2 AppPublisher=Bill Nalen AppPublisherURL=http://bill.nalens.com AppSupportURL=http://bill.nalens.com AppUpdatesURL=http://bill.nalens.com DefaultDirName={pf}\Plucker DisableProgramGroupPage=yes LicenseFile=c:\projects\pluckercond\Copying InfoBeforeFile=c:\projects\pluckercond\readme.txt ;InfoAfterFile=c:\projects\pluckercond\uninstall.txt AllowNoIcons=yes OutputBaseFilename=Setup-PluckerConduit OutputDir=c:\inetpub\wwwroot\HostRocketSite-bill\programs [Types] Name: "full"; Description: "Full installation" [Components] Name: "main"; Description: "Conduit"; Types: full; Flags: fixed [UninstallRun] Filename: "{app}\condinst.exe"; Parameters: "-uninstall -creator Plkr" [Run] Filename: "{app}\condinst.exe"; Parameters: "-install -creator Plkr -name Plucker Conduit -title Plucker Conduit -conduit {app}\PluckerCond.dll"; Flags: nowait [Files] Source: "c:\projects\condinst\Release\condinst.exe"; DestDir: "{app}"; Components: main; CopyMode: alwaysoverwrite Source: "c:\projects\pluckercond\release\pluckercond.dll"; DestDir: "{app}"; Components: main; CopyMode: alwaysoverwrite Source: "c:\projects\pluckercond\changelog.txt"; DestDir: "{app}"; Components: main; CopyMode: alwaysoverwrite Source: "c:\projects\condinst\changelog.condinst.txt"; DestDir: "{app}"; Components: main; CopyMode: alwaysoverwrite Source: "c:\projects\pluckercond\readme.txt"; DestDir: "{app}"; Components: main; CopyMode: alwaysoverwrite Source: "c:\projects\condinst\readme.condinst.txt"; DestDir: "{app}"; Components: main; CopyMode: alwaysoverwrite plucker-1.8/tools/plucker-conduit/msw/r_englsh/0040755000076400001440000000000010052665033020725 5ustar mickeusersplucker-1.8/tools/plucker-conduit/msw/r_englsh/Res/0040755000076400001440000000000010052665033021456 5ustar mickeusersplucker-1.8/tools/plucker-conduit/msw/r_englsh/Res/Sync0.bmp0100644000076400001440000000126607621473073023165 0ustar mickeusersBMv(0@wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxwwwwwwwwwwwwwwwwxwwwwwwwwwwwwwwpwwwwwwwwpwwwwwwwwwwwwwwwwwww333330wwwwwwwww33300wwwflwww0wwwfwwwwwwwwflwwp3333wwwwfwwpwwwwwwfl|wpwwwwwwwf`wwwwwww|`xwwwwwwwf`wxwwwwwww|`wwwwwwwwf`wwwwwwww|wpwwwwwwwwwwwwwwwwpwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwplucker-1.8/tools/plucker-conduit/msw/r_englsh/Res/Sync1.bmp0100644000076400001440000000126607621473073023166 0ustar mickeusersBMv(0@wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwpwwwwwwwwwwwwwwpwwwwwwwwwwwwwwwwwxwwwwwwwwpwwwwwwwwwwp33333wwwwwwwwwwp333wwwwwwwwwwpwwwwwwxwwwwwwwpwwwwwwxwwwwwwww33330wwwxwwwwwwww0wwwwwwxwww|wwwv0wwwxwwwwwgg0wwwwwwxww|fvv0wwwxwwlfgg0wwwwwwxw|fvv0wwwwwlfgg0wwwww|fvwwwwwxwwwwwwwwwwwwwwwwwwwww|wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwplucker-1.8/tools/plucker-conduit/msw/r_englsh/Res/Sync2.bmp0100644000076400001440000000126607621473073023167 0ustar mickeusersBMv(0@wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxwwxwwwwwwwxwwwwwwwwwwwwwwwxwwwwwwwwwwxwwwwwwwwwwxwwwwwwwwwgwwwwwxwwwwwwwvvwwwwxwwwwwwwwwggflwxwwwwvvfwwwwwwxwwwwggflwxwwwwwwvvfwwwwxxwwwwwgflwwwxxwwwwwwwwwwwwwxxwwwwwwwwwwwxxwwwwwwwwwwwwwwxxwwwwwwwwwwwwxwwwwwwwwwwwwwwwwxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwplucker-1.8/tools/plucker-conduit/msw/r_englsh/Res/Sync3.bmp0100644000076400001440000000126607621473073023170 0ustar mickeusersBMv(0@wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxwwwwwwwwwwwwwwxwwxwwwwwwwwwwwwwwxwwwwwwwwwwxwwwwwwwwwwxwwwwwwwwwwwwwwwwxwwwwwwwwwwxwwwwwwwxwwwwwwwwwwwwxwwwwwxwwwxwwwwwwwwwwxwwwwwwwxwwwwwwxwwwwxwwwwwwwwxxwwwwwwwxwwwwwwwxxwwwwxwwwwwwwxxwwwwwwwxwwwwwwwwxxwwwwwwwwwwwwwwxxwwwwwwwwwwwwxwwwwxwwwwwwwwwwwwwxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwplucker-1.8/tools/plucker-conduit/msw/r_englsh/PluckerCond.aps0100644000076400001440000014657007621473073023666 0ustar mickeusers 4$HWB XC:\Projects\PluckerCond\r_englsh\PluckerCond.rcD$HWB0 !!..\resource.hIDS_CONDUIT_NAME1IDD_CONDUIT_CFG_DETAILED101IDD_DIALOG_PROGRESS102IDB_SYNC103IDB_PCTOHH104 IDB_HHTOPC105 IDB_DONOTHING106 IDD_CONDUIT_ACTION399 IDC_ACTIONGROUPBOXTEXT403 IDC_RADIO_SYNC404IDC_RADIO_PCTOHH405IDC_RADIO_HHTOPC406IDC_RADIO_DONOTHING407IDC_MAKEDEFAULT411IDC_SYNC1000IDC_PCTOHH1001IDC_HHTOPC1002IDC_DONOTHING1003IDC_STATIC_PROGRESS1003IDC_STATIC_PERMANENT1004IDC_STATIC_TEMPORARY1005IDC_CURRENT_SETTINGS_GROUP1006IDC_EDIT_STARTURL1008IDC_EDIT_DEPTH1009IDSTR_FIRSTLOG3300IDS_CONNECTION3311IDS_DEVICE_FULL3312IDS_DESKTOP_FULL3313 IDS_BAD_ADD_REC3315!IDS_BAD_PURGE_REMOTE3316"IDS_BAD_DEL_REC3317#IDS_BAD_CHANGE_REC3318$IDS_BAD_LOCALADD_REC3319%IDS_REMOTE_BAD_CHANGE_CAT3320&IDS_BAD_READ_RECORD3322'IDS_REMOTE_TOOMANY_CATS3323(IDS_REMOTE_CAT_DELETED3325)IDS_DOUBLE_MODIFIED3328*IDS_ARCH_DOUBLE_MOD13331+IDS_REVERSE_DELETE3334,IDS_RECCOUNT_DESKTOP13338-IDS_RECCOUNT_PILOT13341.IDS_CUSTOM_LABEL3343/IDS_BAD_XMAP33450IDS_BAD_ARCHIVE_ERR33461IDS_BAD_RESET_FLAGS_REMOTE33482IDS_DOUBLE_MODIFY_SUBSC133583IDS_LOG_SPACING33604IDS_RECORD_COUNT_MISMATCH33615IDS_UNKNOWN_FATAL_ERROR33626IDS_BAD_PURGE_LOCAL33637IDS_BAD_LOCAL_SAVE33648IDS_BAD_RESET_FLAGS_LOCAL33659IDS_BAD_CLOSE_DB_REMOTE3366:IDS_BAD_CLOSE_DB_LOCAL3367;IDS_LOCAL_CAT_DELETED3368<IDS_LOCAL_BAD_CHANGE_CAT3369=IDS_LOCAL_TOOMANY_CATS3370>IDS_DATABASE_DESCRIPTION3371?IDS_DATABASE_SHORT_DESC3372@IDS_PC_DB_CREATE_FAILURE3373AIDS_HH_DB_CREATE_FAILURE3374BIDS_PC_ADD_RECORD_ERROR3375CIDS_HH_ADD_RECORD_ERROR3376DIDS_PC_READ_REC_ERROR3377EIDS_HH_READ_REC_ERROR3378FIDS_RECORD_DESC_ID3379GIDS_RECORD_DESC_INDEX3380HIDSTR_LASTLOG3600IIDS_ADDRESS_TABLESTRING8002JIDS_CUSTOM_TERMINATOR8003KIDS_CURRENT_SETTINGS_GROUP8004LIDS_SYNC_FILES8005MIDS_PCTOHH8006NIDS_HHTOPC8007OIDS_DO_NOTHING8008PIDS_SYNC_ACTION_TEXT8009Q_APS_NEXT_RESOURCE_VALUE103W_APS_NEXT_COMMAND_VALUE40001X_APS_NEXT_CONTROL_VALUE1010Y_APS_NEXT_SYMED_VALUE101Z!!afxres.h!winres.hVS_VERSION_INFO1IDC_STATIC(-1))!CBRS_ALIGN_LEFT0x1000L/CBRS_ALIGN_TOP0x2000L0CBRS_ALIGN_RIGHT0x4000L1CBRS_ALIGN_BOTTOM0x8000L2CBRS_ALIGN_ANY0xF000L3CBRS_BORDER_LEFT0x0100L5CBRS_BORDER_TOP0x0200L6CBRS_BORDER_RIGHT0x0400L7CBRS_BORDER_BOTTOM0x0800L8CBRS_BORDER_ANY0x0F00L9CBRS_TOOLTIPS0x0010L;CBRS_FLYBY0x0020L<CBRS_FLOAT_MULTI0x0040L=CBRS_BORDER_3D0x0080L>CBRS_HIDE_INPLACE0x0008L?CBRS_SIZE_DYNAMIC0x0004L@CBRS_SIZE_FIXED0x0002LACBRS_FLOATING0x0001LBCBRS_GRIPPER0x00400000LDCBRS_ORIENT_HORZ(CBRS_ALIGN_TOP|CBRS_ALIGN_BOTTOM)FCBRS_ORIENT_VERT(CBRS_ALIGN_LEFT|CBRS_ALIGN_RIGHT)GCBRS_ORIENT_ANY(CBRS_ORIENT_HORZ|CBRS_ORIENT_VERT)HCBRS_ALL0x0040FFFFLJCBRS_NOALIGN0x00000000LOCBRS_LEFT(CBRS_ALIGN_LEFT|CBRS_BORDER_RIGHT)PCBRS_TOP(CBRS_ALIGN_TOP|CBRS_BORDER_BOTTOM)QCBRS_RIGHT(CBRS_ALIGN_RIGHT|CBRS_BORDER_LEFT)RCBRS_BOTTOM(CBRS_ALIGN_BOTTOM|CBRS_BORDER_TOP)SID_INDICATOR_EXT0xE700YID_INDICATOR_CAPS0xE701ZID_INDICATOR_NUM0xE702[ID_INDICATOR_SCRL0xE703\ID_INDICATOR_OVR0xE704]ID_INDICATOR_REC0xE705^ID_INDICATOR_KANA0xE706_ID_SEPARATOR0aAFX_IDS_APP_TITLE0xE000AFX_IDS_IDLEMESSAGE0xE001AFX_IDS_HELPMODEMESSAGE0xE002AFX_IDS_APP_TITLE_EMBEDDING0xE003AFX_IDS_COMPANY_NAME0xE004AFX_IDS_OBJ_TITLE_INPLACE0xE005ID_FILE_NEW0xE100ID_FILE_OPEN0xE101ID_FILE_CLOSE0xE102ID_FILE_SAVE0xE103ID_FILE_SAVE_AS0xE104ID_FILE_PAGE_SETUP0xE105ID_FILE_PRINT_SETUP0xE106ID_FILE_PRINT0xE107ID_FILE_PRINT_DIRECT0xE108ID_FILE_PRINT_PREVIEW0xE109ID_FILE_UPDATE0xE10AID_FILE_SAVE_COPY_AS0xE10BID_FILE_SEND_MAIL0xE10CID_FILE_MRU_FIRST0xE110ID_FILE_MRU_FILE10xE110ID_FILE_MRU_FILE20xE111ID_FILE_MRU_FILE30xE112ID_FILE_MRU_FILE40xE113ID_FILE_MRU_FILE50xE114ID_FILE_MRU_FILE60xE115ID_FILE_MRU_FILE70xE116ID_FILE_MRU_FILE80xE117ID_FILE_MRU_FILE90xE118ID_FILE_MRU_FILE100xE119ID_FILE_MRU_FILE110xE11AID_FILE_MRU_FILE120xE11BID_FILE_MRU_FILE130xE11CID_FILE_MRU_FILE140xE11DID_FILE_MRU_FILE150xE11EID_FILE_MRU_FILE160xE11FID_FILE_MRU_LAST0xE11FID_EDIT_CLEAR0xE120ID_EDIT_CLEAR_ALL0xE121ID_EDIT_COPY0xE122ID_EDIT_CUT0xE123ID_EDIT_FIND0xE124ID_EDIT_PASTE0xE125ID_EDIT_PASTE_LINK0xE126ID_EDIT_PASTE_SPECIAL0xE127ID_EDIT_REPEAT0xE128ID_EDIT_REPLACE0xE129ID_EDIT_SELECT_ALL0xE12AID_EDIT_UNDO0xE12BID_EDIT_REDO0xE12CID_WINDOW_NEW0xE130ID_WINDOW_ARRANGE0xE131ID_WINDOW_CASCADE0xE132ID_WINDOW_TILE_HORZ0xE133ID_WINDOW_TILE_VERT0xE134ID_WINDOW_SPLIT0xE135ID_APP_ABOUT0xE140ID_APP_EXIT0xE141ID_HELP_INDEX0xE142ID_HELP_FINDER0xE143ID_HELP_USING0xE144ID_CONTEXT_HELP0xE145ID_HELP0xE146ID_DEFAULT_HELP0xE147ID_NEXT_PANE0xE150ID_PREV_PANE0xE151ID_FORMAT_FONT0xE160ID_OLE_INSERT_NEW0xE200ID_OLE_EDIT_LINKS0xE201ID_OLE_EDIT_CONVERT0xE202ID_OLE_EDIT_CHANGE_ICON0xE203ID_OLE_EDIT_PROPERTIES0xE204ID_OLE_VERB_FIRST0xE210AFX_ID_PREVIEW_CLOSE0xE300AFX_ID_PREVIEW_NUMPAGE0xE301AFX_ID_PREVIEW_NEXT0xE302AFX_ID_PREVIEW_PREV0xE303AFX_ID_PREVIEW_PRINT0xE304AFX_ID_PREVIEW_ZOOMIN0xE305AFX_ID_PREVIEW_ZOOMOUT0xE306ID_VIEW_TOOLBAR0xE800ID_VIEW_STATUS_BAR0xE801ID_VIEW_REBAR0xE804 ID_VIEW_AUTOARRANGE0xE805 ID_VIEW_SMALLICON0xE810 ID_VIEW_LARGEICON0xE811 ID_VIEW_LIST0xE812ID_VIEW_DETAILS0xE813ID_VIEW_LINEUP0xE814ID_VIEW_BYNAME0xE815AFX_ID_VIEW_MINIMUMID_VIEW_SMALLICONAFX_ID_VIEW_MAXIMUMID_VIEW_BYNAMEID_RECORD_FIRST0xE900ID_RECORD_LAST0xE901ID_RECORD_NEXT0xE902ID_RECORD_PREV0xE903IDC_STATIC(-1)"AFX_IDS_SCSIZE0xEF00+AFX_IDS_SCMOVE0xEF01,AFX_IDS_SCMINIMIZE0xEF02-AFX_IDS_SCMAXIMIZE0xEF03.AFX_IDS_SCNEXTWINDOW0xEF04/AFX_IDS_SCPREVWINDOW0xEF050AFX_IDS_SCCLOSE0xEF061AFX_IDS_SCRESTORE0xEF122AFX_IDS_SCTASKLIST0xEF133AFX_IDS_MDICHILD0xEF1F5AFX_IDS_DESKACCESSORY0xEFDA7AFX_IDS_OPENFILE0xF000:AFX_IDS_SAVEFILE0xF001;AFX_IDS_ALLFILTER0xF002<AFX_IDS_UNTITLED0xF003=AFX_IDS_SAVEFILECOPY0xF004>AFX_IDS_PREVIEW_CLOSE0xF005?AFX_IDS_UNNAMED_FILE0xF006@AFX_IDS_HIDE0xF011AAFX_IDP_NO_ERROR_AVAILABLE0xF020DAFX_IDS_NOT_SUPPORTED_EXCEPTION0xF021EAFX_IDS_RESOURCE_EXCEPTION0xF022FAFX_IDS_MEMORY_EXCEPTION0xF023GAFX_IDS_USER_EXCEPTION0xF024HAFX_IDS_PRINTONPORT0xF040KAFX_IDS_ONEPAGE0xF041LAFX_IDS_TWOPAGE0xF042MAFX_IDS_PRINTPAGENUM0xF043NAFX_IDS_PREVIEWPAGEDESC0xF044OAFX_IDS_PRINTDEFAULTEXT0xF045PAFX_IDS_PRINTDEFAULT0xF046QAFX_IDS_PRINTFILTER0xF047RAFX_IDS_PRINTCAPTION0xF048SAFX_IDS_PRINTTOFILE0xF049TAFX_IDS_OBJECT_MENUITEM0xF080XAFX_IDS_EDIT_VERB0xF081YAFX_IDS_ACTIVATE_VERB0xF082ZAFX_IDS_CHANGE_LINK0xF083[AFX_IDS_AUTO0xF084\AFX_IDS_MANUAL0xF085]AFX_IDS_FROZEN0xF086^AFX_IDS_ALL_FILES0xF087_AFX_IDS_SAVE_MENU0xF088aAFX_IDS_UPDATE_MENU0xF089bAFX_IDS_SAVE_AS_MENU0xF08AcAFX_IDS_SAVE_COPY_AS_MENU0xF08BdAFX_IDS_EXIT_MENU0xF08CeAFX_IDS_UPDATING_ITEMS0xF08DfAFX_IDS_METAFILE_FORMAT0xF08EhAFX_IDS_DIB_FORMAT0xF08FiAFX_IDS_BITMAP_FORMAT0xF090jAFX_IDS_LINKSOURCE_FORMAT0xF091kAFX_IDS_EMBED_FORMAT0xF092lAFX_IDS_PASTELINKEDTYPE0xF094nAFX_IDS_UNKNOWNTYPE0xF095oAFX_IDS_RTF_FORMAT0xF096pAFX_IDS_TEXT_FORMAT0xF097qAFX_IDS_INVALID_CURRENCY0xF098sAFX_IDS_INVALID_DATETIME0xF099tAFX_IDS_INVALID_DATETIMESPAN0xF09AuAFX_IDP_INVALID_FILENAME0xF100xAFX_IDP_FAILED_TO_OPEN_DOC0xF101yAFX_IDP_FAILED_TO_SAVE_DOC0xF102zAFX_IDP_ASK_TO_SAVE0xF103{AFX_IDP_FAILED_TO_CREATE_DOC0xF104|AFX_IDP_FILE_TOO_LARGE0xF105}AFX_IDP_FAILED_TO_START_PRINT0xF106~AFX_IDP_FAILED_TO_LAUNCH_HELP0xF107AFX_IDP_INTERNAL_FAILURE0xF108AFX_IDP_COMMAND_FAILURE0xF109AFX_IDP_FAILED_MEMORY_ALLOC0xF10AAFX_IDP_UNREG_DONE0xF10BAFX_IDP_UNREG_FAILURE0xF10CAFX_IDP_DLL_LOAD_FAILED0xF10DAFX_IDP_DLL_BAD_VERSION0xF10EAFX_IDP_PARSE_INT0xF110AFX_IDP_PARSE_REAL0xF111AFX_IDP_PARSE_INT_RANGE0xF112AFX_IDP_PARSE_REAL_RANGE0xF113AFX_IDP_PARSE_STRING_SIZE0xF114AFX_IDP_PARSE_RADIO_BUTTON0xF115AFX_IDP_PARSE_BYTE0xF116AFX_IDP_PARSE_UINT0xF117AFX_IDP_PARSE_DATETIME0xF118AFX_IDP_PARSE_CURRENCY0xF119AFX_IDP_FAILED_INVALID_FORMAT0xF120AFX_IDP_FAILED_INVALID_PATH0xF121AFX_IDP_FAILED_DISK_FULL0xF122AFX_IDP_FAILED_ACCESS_READ0xF123AFX_IDP_FAILED_ACCESS_WRITE0xF124AFX_IDP_FAILED_IO_ERROR_READ0xF125AFX_IDP_FAILED_IO_ERROR_WRITE0xF126AFX_IDP_STATIC_OBJECT0xF180AFX_IDP_FAILED_TO_CONNECT0xF181AFX_IDP_SERVER_BUSY0xF182AFX_IDP_BAD_VERB0xF183AFX_IDS_NOT_DOCOBJECT0xF184AFX_IDP_FAILED_TO_NOTIFY0xF185AFX_IDP_FAILED_TO_LAUNCH0xF186AFX_IDP_ASK_TO_UPDATE0xF187AFX_IDP_FAILED_TO_UPDATE0xF188AFX_IDP_FAILED_TO_REGISTER0xF189AFX_IDP_FAILED_TO_AUTO_REGISTER0xF18AAFX_IDP_FAILED_TO_CONVERT0xF18BAFX_IDP_GET_NOT_SUPPORTED0xF18CAFX_IDP_SET_NOT_SUPPORTED0xF18DAFX_IDP_ASK_TO_DISCARD0xF18EAFX_IDP_FAILED_TO_CREATE0xF18FAFX_IDP_FAILED_MAPI_LOAD0xF190AFX_IDP_INVALID_MAPI_DLL0xF191AFX_IDP_FAILED_MAPI_SEND0xF192AFX_IDP_FILE_NONE0xF1A0AFX_IDP_FILE_GENERIC0xF1A1AFX_IDP_FILE_NOT_FOUND0xF1A2AFX_IDP_FILE_BAD_PATH0xF1A3AFX_IDP_FILE_TOO_MANY_OPEN0xF1A4AFX_IDP_FILE_ACCESS_DENIED0xF1A5AFX_IDP_FILE_INVALID_FILE0xF1A6AFX_IDP_FILE_REMOVE_CURRENT0xF1A7AFX_IDP_FILE_DIR_FULL0xF1A8AFX_IDP_FILE_BAD_SEEK0xF1A9AFX_IDP_FILE_HARD_IO0xF1AAAFX_IDP_FILE_SHARING0xF1ABAFX_IDP_FILE_LOCKING0xF1ACAFX_IDP_FILE_DISKFULL0xF1ADAFX_IDP_FILE_EOF0xF1AEAFX_IDP_ARCH_NONE0xF1B0AFX_IDP_ARCH_GENERIC0xF1B1AFX_IDP_ARCH_READONLY0xF1B2AFX_IDP_ARCH_ENDOFFILE0xF1B3AFX_IDP_ARCH_WRITEONLY0xF1B4AFX_IDP_ARCH_BADINDEX0xF1B5AFX_IDP_ARCH_BADCLASS0xF1B6AFX_IDP_ARCH_BADSCHEMA0xF1B7AFX_IDS_OCC_SCALEUNITS_PIXELS0xF1C0AFX_IDS_STATUS_FONT0xF230AFX_IDS_TOOLTIP_FONT0xF231AFX_IDS_UNICODE_FONT0xF232AFX_IDS_MINI_FONT0xF233AFX_IDP_SQL_CONNECT_FAIL0xF281AFX_IDP_SQL_RECORDSET_FORWARD_ONLY0xF282AFX_IDP_SQL_EMPTY_COLUMN_LIST0xF283AFX_IDP_SQL_FIELD_SCHEMA_MISMATCH0xF284AFX_IDP_SQL_ILLEGAL_MODE0xF285AFX_IDP_SQL_MULTIPLE_ROWS_AFFECTED0xF286AFX_IDP_SQL_NO_CURRENT_RECORD0xF287AFX_IDP_SQL_NO_ROWS_AFFECTED0xF288AFX_IDP_SQL_RECORDSET_READONLY0xF289AFX_IDP_SQL_SQL_NO_TOTAL0xF28AAFX_IDP_SQL_ODBC_LOAD_FAILED0xF28BAFX_IDP_SQL_DYNASET_NOT_SUPPORTED0xF28CAFX_IDP_SQL_SNAPSHOT_NOT_SUPPORTED0xF28DAFX_IDP_SQL_API_CONFORMANCE0xF28EAFX_IDP_SQL_SQL_CONFORMANCE0xF28FAFX_IDP_SQL_NO_DATA_FOUND0xF290AFX_IDP_SQL_ROW_UPDATE_NOT_SUPPORTED0xF291AFX_IDP_SQL_ODBC_V2_REQUIRED0xF292AFX_IDP_SQL_NO_POSITIONED_UPDATES0xF293AFX_IDP_SQL_LOCK_MODE_NOT_SUPPORTED0xF294AFX_IDP_SQL_DATA_TRUNCATED0xF295AFX_IDP_SQL_ROW_FETCH0xF296AFX_IDP_SQL_INCORRECT_ODBC0xF297AFX_IDP_SQL_UPDATE_DELETE_FAILED0xF298AFX_IDP_SQL_DYNAMIC_CURSOR_NOT_SUPPORTED0xF299AFX_IDP_SQL_FIELD_NOT_FOUND0xF29AAFX_IDP_SQL_BOOKMARKS_NOT_SUPPORTED0xF29BAFX_IDP_SQL_BOOKMARKS_NOT_ENABLED0xF29CAFX_IDS_DELETED0xF29DAFX_IDP_DAO_ENGINE_INITIALIZATION0xF2B0AFX_IDP_DAO_DFX_BIND0xF2B1AFX_IDP_DAO_OBJECT_NOT_OPEN0xF2B2AFX_IDP_DAO_ROWTOOSHORT0xF2B3AFX_IDP_DAO_BADBINDINFO0xF2B4AFX_IDP_DAO_COLUMNUNAVAILABLE0xF2B5AFX_IDS_HTTP_TITLE0xF2D1 AFX_IDS_HTTP_NO_TEXT0xF2D2AFX_IDS_HTTP_BAD_REQUEST0xF2D3AFX_IDS_HTTP_AUTH_REQUIRED0xF2D4AFX_IDS_HTTP_FORBIDDEN0xF2D5AFX_IDS_HTTP_NOT_FOUND0xF2D6AFX_IDS_HTTP_SERVER_ERROR0xF2D7AFX_IDS_HTTP_NOT_IMPLEMENTED0xF2D8AFX_IDC_LISTBOX100AFX_IDC_CHANGE101AFX_IDC_PRINT_DOCNAME201AFX_IDC_PRINT_PRINTERNAME202AFX_IDC_PRINT_PORTNAME203 AFX_IDC_PRINT_PAGENUM204!ID_APPLY_NOW0x3021$ID_WIZBACK0x3023%ID_WIZNEXT0x3024&ID_WIZFINISH0x3025'AFX_IDC_TAB_CONTROL0x3020(AFX_IDD_NEWTYPEDLG30721;AFX_IDD_PRINTDLG30722<AFX_IDD_PREVIEW_TOOLBAR30723=AFX_IDD_INSERTOBJECT30724@AFX_IDD_CHANGEICON30725AAFX_IDD_CONVERT30726BAFX_IDD_PASTESPECIAL30727CAFX_IDD_EDITLINKS30728DAFX_IDD_FILEBROWSE30729EAFX_IDD_BUSY30730FAFX_IDD_OBJECTPROPERTIES30732HAFX_IDD_CHANGESOURCE30733IAFX_IDC_CONTEXTHELP30977MAFX_IDC_MAGNIFY30978NAFX_IDC_SMALLARROWS30979OAFX_IDC_HSPLITBAR30980PAFX_IDC_VSPLITBAR30981QAFX_IDC_NODROPCRSR30982RAFX_IDC_TRACKNWSE30983SAFX_IDC_TRACKNESW30984TAFX_IDC_TRACKNS30985UAFX_IDC_TRACKWE30986VAFX_IDC_TRACK4WAY30987WAFX_IDC_MOVE4WAY30988XAFX_IDB_MINIFRAME_MENU30994[AFX_IDB_CHECKLISTBOX_NT30995^AFX_IDB_CHECKLISTBOX_9530996_AFX_IDR_PREVIEW_ACCEL30997bAFX_IDI_STD_MDIFRAME31233eAFX_IDI_STD_FRAME31234fAFX_IDC_FONTPROP1000lAFX_IDC_FONTNAMES1001mAFX_IDC_FONTSTYLES1002nAFX_IDC_FONTSIZES1003oAFX_IDC_STRIKEOUT1004pAFX_IDC_UNDERLINE1005qAFX_IDC_SAMPLEBOX1006rAFX_IDC_COLOR_BLACK1100uAFX_IDC_COLOR_WHITE1101vAFX_IDC_COLOR_RED1102wAFX_IDC_COLOR_GREEN1103xAFX_IDC_COLOR_BLUE1104yAFX_IDC_COLOR_YELLOW1105zAFX_IDC_COLOR_MAGENTA1106{AFX_IDC_COLOR_CYAN1107|AFX_IDC_COLOR_GRAY1108}AFX_IDC_COLOR_LIGHTGRAY1109~AFX_IDC_COLOR_DARKRED1110AFX_IDC_COLOR_DARKGREEN1111AFX_IDC_COLOR_DARKBLUE1112AFX_IDC_COLOR_LIGHTBROWN1113AFX_IDC_COLOR_DARKMAGENTA1114AFX_IDC_COLOR_DARKCYAN1115AFX_IDC_COLORPROP1116AFX_IDC_SYSTEMCOLORS1117AFX_IDC_PROPNAME1201AFX_IDC_PICTURE1202AFX_IDC_BROWSE1203AFX_IDC_CLEAR1204AFX_IDD_PROPPAGE_COLOR32257AFX_IDD_PROPPAGE_FONT32258AFX_IDD_PROPPAGE_PICTURE32259AFX_IDB_TRUETYPE32384AFX_IDS_PROPPAGE_UNKNOWN0xFE01AFX_IDS_COLOR_DESKTOP0xFE04AFX_IDS_COLOR_APPWORKSPACE0xFE05AFX_IDS_COLOR_WNDBACKGND0xFE06AFX_IDS_COLOR_WNDTEXT0xFE07AFX_IDS_COLOR_MENUBAR0xFE08AFX_IDS_COLOR_MENUTEXT0xFE09AFX_IDS_COLOR_ACTIVEBAR0xFE0AAFX_IDS_COLOR_INACTIVEBAR0xFE0BAFX_IDS_COLOR_ACTIVETEXT0xFE0CAFX_IDS_COLOR_INACTIVETEXT0xFE0DAFX_IDS_COLOR_ACTIVEBORDER0xFE0EAFX_IDS_COLOR_INACTIVEBORDER0xFE0FAFX_IDS_COLOR_WNDFRAME0xFE10AFX_IDS_COLOR_SCROLLBARS0xFE11AFX_IDS_COLOR_BTNFACE0xFE12AFX_IDS_COLOR_BTNSHADOW0xFE13AFX_IDS_COLOR_BTNTEXT0xFE14AFX_IDS_COLOR_BTNHIGHLIGHT0xFE15AFX_IDS_COLOR_DISABLEDTEXT0xFE16AFX_IDS_COLOR_HIGHLIGHT0xFE17AFX_IDS_COLOR_HIGHLIGHTTEXT0xFE18AFX_IDS_REGULAR0xFE19AFX_IDS_BOLD0xFE1AAFX_IDS_ITALIC0xFE1BAFX_IDS_BOLDITALIC0xFE1CAFX_IDS_SAMPLETEXT0xFE1DAFX_IDS_DISPLAYSTRING_FONT0xFE1EAFX_IDS_DISPLAYSTRING_COLOR0xFE1FAFX_IDS_DISPLAYSTRING_PICTURE0xFE20AFX_IDS_PICTUREFILTER0xFE21AFX_IDS_PICTYPE_UNKNOWN0xFE22AFX_IDS_PICTYPE_NONE0xFE23AFX_IDS_PICTYPE_BITMAP0xFE24AFX_IDS_PICTYPE_METAFILE0xFE25AFX_IDS_PICTYPE_ICON0xFE26AFX_IDS_COLOR_PPG0xFE28AFX_IDS_COLOR_PPG_CAPTION0xFE29AFX_IDS_FONT_PPG0xFE2AAFX_IDS_FONT_PPG_CAPTION0xFE2BAFX_IDS_PICTURE_PPG0xFE2CAFX_IDS_PICTURE_PPG_CAPTION0xFE2DAFX_IDS_PICTUREBROWSETITLE0xFE30AFX_IDS_BORDERSTYLE_00xFE31AFX_IDS_BORDERSTYLE_10xFE32AFX_IDS_VERB_EDIT0xFE40AFX_IDS_VERB_PROPERTIES0xFE41AFX_IDP_PICTURECANTOPEN0xFE83AFX_IDP_PICTURECANTLOAD0xFE84AFX_IDP_PICTURETOOLARGE0xFE85AFX_IDP_PICTUREREADFAILED0xFE86AFX_IDP_E_ILLEGALFUNCTIONCALL0xFEA0AFX_IDP_E_OVERFLOW0xFEA1AFX_IDP_E_OUTOFMEMORY0xFEA2AFX_IDP_E_DIVISIONBYZERO0xFEA3AFX_IDP_E_OUTOFSTRINGSPACE0xFEA4AFX_IDP_E_OUTOFSTACKSPACE0xFEA5AFX_IDP_E_BADFILENAMEORNUMBER0xFEA6AFX_IDP_E_FILENOTFOUND0xFEA7AFX_IDP_E_BADFILEMODE0xFEA8AFX_IDP_E_FILEALREADYOPEN0xFEA9AFX_IDP_E_DEVICEIOERROR0xFEAAAFX_IDP_E_FILEALREADYEXISTS0xFEABAFX_IDP_E_BADRECORDLENGTH0xFEACAFX_IDP_E_DISKFULL0xFEADAFX_IDP_E_BADRECORDNUMBER0xFEAEAFX_IDP_E_BADFILENAME0xFEAFAFX_IDP_E_TOOMANYFILES0xFEB0AFX_IDP_E_DEVICEUNAVAILABLE0xFEB1AFX_IDP_E_PERMISSIONDENIED0xFEB2AFX_IDP_E_DISKNOTREADY0xFEB3AFX_IDP_E_PATHFILEACCESSERROR0xFEB4AFX_IDP_E_PATHNOTFOUND0xFEB5AFX_IDP_E_INVALIDPATTERNSTRING0xFEB6AFX_IDP_E_INVALIDUSEOFNULL0xFEB7AFX_IDP_E_INVALIDFILEFORMAT0xFEB8AFX_IDP_E_INVALIDPROPERTYVALUE0xFEB9AFX_IDP_E_INVALIDPROPERTYARRAYINDEX0xFEBAAFX_IDP_E_SETNOTSUPPORTEDATRUNTIME0xFEBBAFX_IDP_E_SETNOTSUPPORTED0xFEBCAFX_IDP_E_NEEDPROPERTYARRAYINDEX0xFEBDAFX_IDP_E_SETNOTPERMITTED0xFEBEAFX_IDP_E_GETNOTSUPPORTEDATRUNTIME0xFEBFAFX_IDP_E_GETNOTSUPPORTED0xFEC0AFX_IDP_E_PROPERTYNOTFOUND0xFEC1AFX_IDP_E_INVALIDCLIPBOARDFORMAT0xFEC2AFX_IDP_E_INVALIDPICTURE0xFEC3AFX_IDP_E_PRINTERERROR0xFEC4AFX_IDP_E_CANTSAVEFILETOTEMP0xFEC5AFX_IDP_E_SEARCHTEXTNOTFOUND0xFEC6AFX_IDP_E_REPLACEMENTSTOOLONG0xFEC7!!$HWB0 j Res\Sync3.bmpi Res\Sync2.bmph Res\Sync1.bmpg Res\Sync0.bmp $HWB0 TEXTINCLUDE1$TEXTINCLUDE2$TEXTINCLUDE3$161VS_VERSION_INFOC:\Projects\PluckerCond\r_englsh\PluckerCond.rc;$DESIGNINFOGUIDELINES$5399IDD_CONDUIT_ACTIONC:\Projects\PluckerCond\r_englsh\PluckerCond.rcIDC_RADIO_SYNCIDC_RADIO_PCTOHHIDC_RADIO_HHTOPCIDC_RADIO_DONOTHINGIDC_MAKEDEFAULTIDOKIDCANCEL IDC_ACTIONGROUPBOXTEXTIDC_SYNCIDC_PCTOHHIDC_HHTOPCIDC_DONOTHINGIDC_STATICIDC_STATICIDC_EDIT_STARTURLIDC_STATICIDC_EDIT_DEPTH$5101IDD_CONDUIT_CFG_DETAILEDC:\Projects\PluckerCond\r_englsh\PluckerCond.rcIDC_RADIO_SYNCIDC_RADIO_PCTOHHIDC_RADIO_HHTOPCIDC_RADIO_DONOTHINGIDC_MAKEDEFAULTIDOKIDCANCEL IDC_ACTIONGROUPBOXTEXTIDC_SYNCIDC_PCTOHHIDC_HHTOPCIDC_DONOTHINGIDC_STATICIDC_STATICIDC_STATICIDC_STATICIDC_EDIT_STARTURLIDC_STATICIDC_EDIT_DEPTH$5102IDD_DIALOG_PROGRESSC:\Projects\PluckerCond\r_englsh\PluckerCond.rcIDCANCELIDC_STATIC_PROGRESS$2106IDB_DONOTHINGC:\Projects\PluckerCond\r_englsh\PluckerCond.rc$2105IDB_HHTOPCC:\Projects\PluckerCond\r_englsh\PluckerCond.rc$2104IDB_PCTOHHC:\Projects\PluckerCond\r_englsh\PluckerCond.rc$2103IDB_SYNCC:\Projects\PluckerCond\r_englsh\PluckerCond.rc$61IDS_CONDUIT_NAME$6207IDS_CONNECTION $6208IDS_DEVICE_FULL IDS_DESKTOP_FULL IDS_BAD_ADD_REC IDS_BAD_PURGE_REMOTE IDS_BAD_DEL_REC IDS_BAD_CHANGE_REC IDS_BAD_LOCALADD_REC IDS_REMOTE_BAD_CHANGE_CAT IDS_BAD_READ_RECORD IDS_REMOTE_TOOMANY_CATS IDS_REMOTE_CAT_DELETED $6209IDS_DOUBLE_MODIFIED IDS_ARCH_DOUBLE_MOD1 IDS_REVERSE_DELETE IDS_RECCOUNT_DESKTOP1 IDS_RECCOUNT_PILOT1 IDS_CUSTOM_LABEL $6210IDS_BAD_XMAP IDS_BAD_ARCHIVE_ERR IDS_BAD_RESET_FLAGS_REMOTE IDS_DOUBLE_MODIFY_SUBSC1 $6211IDS_LOG_SPACING IDS_RECORD_COUNT_MISMATCH! IDS_UNKNOWN_FATAL_ERROR" IDS_BAD_PURGE_LOCAL# IDS_BAD_LOCAL_SAVE$ IDS_BAD_RESET_FLAGS_LOCAL% IDS_BAD_CLOSE_DB_REMOTE& IDS_BAD_CLOSE_DB_LOCAL' IDS_LOCAL_CAT_DELETED( IDS_LOCAL_BAD_CHANGE_CAT) IDS_LOCAL_TOOMANY_CATS* IDS_DATABASE_DESCRIPTION+ IDS_DATABASE_SHORT_DESC, IDS_PC_DB_CREATE_FAILURE- IDS_HH_DB_CREATE_FAILURE. IDS_PC_ADD_RECORD_ERROR/ $6212IDS_HH_ADD_RECORD_ERROR0 IDS_PC_READ_REC_ERROR1 IDS_HH_READ_REC_ERROR2 IDS_RECORD_DESC_ID3 IDS_RECORD_DESC_INDEX4 $6501IDS_CURRENT_SETTINGS_GROUPDIDS_SYNC_FILESEIDS_PCTOHHFIDS_HHTOPCGIDS_DO_NOTHINGHIDS_SYNC_ACTION_TEXTI$$t$HWB/0 C:\Projects\PluckerCond\r_englsh\..\resource.hC:\MVS6\VC98\MFC\INCLUDE/afxres.hC:\MVS6\VC98\MFC\INCLUDE/winres.hA$HWB-0 TEXTINCLUDE1TEXTINCLUDE2TEXTINCLUDE3161VS_VERSION_INFODESIGNINFOGUIDELINES5399IDD_CONDUIT_ACTION5101IDD_CONDUIT_CFG_DETAILED5102IDD_DIALOG_PROGRESS2106IDB_DONOTHING2105IDB_HHTOPC2104IDB_PCTOHH2103IDB_SYNC616207620862096210621162126501240399IDD_CONDUIT_ACTION5B$HWB.0 ID_SEPARATOR0IDOK1IDS_CONDUIT_NAME1 VS_VERSION_INFO1IDCANCEL2IDABORT3IDRETRY4IDIGNORE5IDYES6IDNO7IDCLOSE8IDHELP9AFX_IDC_LISTBOX100IDD_CONDUIT_CFG_DETAILED101AFX_IDC_CHANGE101_APS_NEXT_SYMED_VALUE101IDD_DIALOG_PROGRESS102IDB_SYNC103 IDB_PCTOHH104 IDB_HHTOPC105 _APS_NEXT_RESOURCE_VALUE105IDB_DONOTHING106 AFX_IDC_PRINT_DOCNAME201AFX_IDC_PRINT_PRINTERNAME202AFX_IDC_PRINT_PORTNAME203AFX_IDC_PRINT_PAGENUM204IDD_CONDUIT_ACTION399IDC_ACTIONGROUPBOXTEXT403IDC_RADIO_SYNC404IDC_RADIO_PCTOHH405IDC_RADIO_HHTOPC406IDC_RADIO_DONOTHING407IDC_MAKEDEFAULT411IDC_SYNC1000AFX_IDC_FONTPROP1000IDC_PCTOHH1001AFX_IDC_FONTNAMES1001IDC_HHTOPC1002AFX_IDC_FONTSTYLES1002IDC_DONOTHING1003IDC_STATIC_PROGRESS1003AFX_IDC_FONTSIZES1003IDC_STATIC_PERMANENT1004AFX_IDC_STRIKEOUT1004IDC_STATIC_TEMPORARY1005AFX_IDC_UNDERLINE1005IDC_CURRENT_SETTINGS_GROUP1006AFX_IDC_SAMPLEBOX1006IDC_EDIT_STARTURL1008IDC_EDIT_DEPTH1009IDC_EDIT_SELECTION1010_APS_NEXT_CONTROL_VALUE1011AFX_IDC_COLOR_BLACK1100AFX_IDC_COLOR_WHITE1101AFX_IDC_COLOR_RED1102AFX_IDC_COLOR_GREEN1103AFX_IDC_COLOR_BLUE1104AFX_IDC_COLOR_YELLOW1105AFX_IDC_COLOR_MAGENTA1106AFX_IDC_COLOR_CYAN1107AFX_IDC_COLOR_GRAY1108AFX_IDC_COLOR_LIGHTGRAY1109AFX_IDC_COLOR_DARKRED1110AFX_IDC_COLOR_DARKGREEN1111AFX_IDC_COLOR_DARKBLUE1112AFX_IDC_COLOR_LIGHTBROWN1113AFX_IDC_COLOR_DARKMAGENTA1114AFX_IDC_COLOR_DARKCYAN1115AFX_IDC_COLORPROP1116AFX_IDC_SYSTEMCOLORS1117AFX_IDC_PROPNAME1201AFX_IDC_PICTURE1202AFX_IDC_BROWSE1203AFX_IDC_CLEAR1204IDSTR_FIRSTLOG3300IDS_CONNECTION3311IDS_DEVICE_FULL3312IDS_DESKTOP_FULL3313IDS_BAD_ADD_REC3315IDS_BAD_PURGE_REMOTE3316IDS_BAD_DEL_REC3317IDS_BAD_CHANGE_REC3318IDS_BAD_LOCALADD_REC3319IDS_REMOTE_BAD_CHANGE_CAT3320IDS_BAD_READ_RECORD3322IDS_REMOTE_TOOMANY_CATS3323IDS_REMOTE_CAT_DELETED3325IDS_DOUBLE_MODIFIED3328IDS_ARCH_DOUBLE_MOD13331IDS_REVERSE_DELETE3334IDS_RECCOUNT_DESKTOP13338IDS_RECCOUNT_PILOT13341IDS_CUSTOM_LABEL3343IDS_BAD_XMAP3345IDS_BAD_ARCHIVE_ERR3346IDS_BAD_RESET_FLAGS_REMOTE3348IDS_DOUBLE_MODIFY_SUBSC13358IDS_LOG_SPACING3360IDS_RECORD_COUNT_MISMATCH3361IDS_UNKNOWN_FATAL_ERROR3362IDS_BAD_PURGE_LOCAL3363IDS_BAD_LOCAL_SAVE3364IDS_BAD_RESET_FLAGS_LOCAL3365IDS_BAD_CLOSE_DB_REMOTE3366IDS_BAD_CLOSE_DB_LOCAL3367IDS_LOCAL_CAT_DELETED3368IDS_LOCAL_BAD_CHANGE_CAT3369IDS_LOCAL_TOOMANY_CATS3370IDS_DATABASE_DESCRIPTION3371IDS_DATABASE_SHORT_DESC3372IDS_PC_DB_CREATE_FAILURE3373IDS_HH_DB_CREATE_FAILURE3374IDS_PC_ADD_RECORD_ERROR3375IDS_HH_ADD_RECORD_ERROR3376IDS_PC_READ_REC_ERROR3377IDS_HH_READ_REC_ERROR3378IDS_RECORD_DESC_ID3379IDS_RECORD_DESC_INDEX3380IDSTR_LASTLOG3600IDS_ADDRESS_TABLESTRING8002IDS_CUSTOM_TERMINATOR8003IDS_CURRENT_SETTINGS_GROUP8004IDS_SYNC_FILES8005IDS_PCTOHH8006IDS_HHTOPC8007IDS_DO_NOTHING8008IDS_SYNC_ACTION_TEXT8009AFX_IDC_TAB_CONTROL0x3020ID_APPLY_NOW0x3021ID_WIZBACK0x3023ID_WIZNEXT0x3024ID_WIZFINISH0x3025AFX_IDD_NEWTYPEDLG30721AFX_IDD_PRINTDLG30722AFX_IDD_PREVIEW_TOOLBAR30723AFX_IDD_INSERTOBJECT30724AFX_IDD_CHANGEICON30725AFX_IDD_CONVERT30726AFX_IDD_PASTESPECIAL30727AFX_IDD_EDITLINKS30728AFX_IDD_FILEBROWSE30729AFX_IDD_BUSY30730AFX_IDD_OBJECTPROPERTIES30732AFX_IDD_CHANGESOURCE30733AFX_IDC_CONTEXTHELP30977AFX_IDC_MAGNIFY30978AFX_IDC_SMALLARROWS30979AFX_IDC_HSPLITBAR30980AFX_IDC_VSPLITBAR30981AFX_IDC_NODROPCRSR30982AFX_IDC_TRACKNWSE30983AFX_IDC_TRACKNESW30984AFX_IDC_TRACKNS30985AFX_IDC_TRACKWE30986AFX_IDC_TRACK4WAY30987AFX_IDC_MOVE4WAY30988AFX_IDB_MINIFRAME_MENU30994AFX_IDB_CHECKLISTBOX_NT30995AFX_IDB_CHECKLISTBOX_9530996AFX_IDR_PREVIEW_ACCEL30997AFX_IDI_STD_MDIFRAME31233AFX_IDI_STD_FRAME31234AFX_IDD_PROPPAGE_COLOR32257AFX_IDD_PROPPAGE_FONT32258AFX_IDD_PROPPAGE_PICTURE32259AFX_IDB_TRUETYPE32384_APS_NEXT_COMMAND_VALUE40001AFX_IDS_APP_TITLE0xE000AFX_IDS_IDLEMESSAGE0xE001AFX_IDS_HELPMODEMESSAGE0xE002AFX_IDS_APP_TITLE_EMBEDDING0xE003AFX_IDS_COMPANY_NAME0xE004AFX_IDS_OBJ_TITLE_INPLACE0xE005ID_FILE_NEW0xE100ID_FILE_OPEN0xE101ID_FILE_CLOSE0xE102ID_FILE_SAVE0xE103ID_FILE_SAVE_AS0xE104ID_FILE_PAGE_SETUP0xE105ID_FILE_PRINT_SETUP0xE106ID_FILE_PRINT0xE107ID_FILE_PRINT_DIRECT0xE108ID_FILE_PRINT_PREVIEW0xE109ID_FILE_UPDATE0xE10AID_FILE_SAVE_COPY_AS0xE10BID_FILE_SEND_MAIL0xE10CID_FILE_MRU_FIRST0xE110ID_FILE_MRU_FILE10xE110ID_FILE_MRU_FILE20xE111ID_FILE_MRU_FILE30xE112ID_FILE_MRU_FILE40xE113ID_FILE_MRU_FILE50xE114ID_FILE_MRU_FILE60xE115ID_FILE_MRU_FILE70xE116ID_FILE_MRU_FILE80xE117ID_FILE_MRU_FILE90xE118ID_FILE_MRU_FILE100xE119ID_FILE_MRU_FILE110xE11AID_FILE_MRU_FILE120xE11BID_FILE_MRU_FILE130xE11CID_FILE_MRU_FILE140xE11DID_FILE_MRU_FILE150xE11EID_FILE_MRU_FILE160xE11FID_FILE_MRU_LAST0xE11FID_EDIT_CLEAR0xE120ID_EDIT_CLEAR_ALL0xE121ID_EDIT_COPY0xE122ID_EDIT_CUT0xE123ID_EDIT_FIND0xE124ID_EDIT_PASTE0xE125ID_EDIT_PASTE_LINK0xE126ID_EDIT_PASTE_SPECIAL0xE127ID_EDIT_REPEAT0xE128ID_EDIT_REPLACE0xE129ID_EDIT_SELECT_ALL0xE12AID_EDIT_UNDO0xE12BID_EDIT_REDO0xE12CID_WINDOW_NEW0xE130ID_WINDOW_ARRANGE0xE131ID_WINDOW_CASCADE0xE132ID_WINDOW_TILE_HORZ0xE133ID_WINDOW_TILE_VERT0xE134ID_WINDOW_SPLIT0xE135ID_APP_ABOUT0xE140ID_APP_EXIT0xE141ID_HELP_INDEX0xE142ID_HELP_FINDER0xE143ID_HELP_USING0xE144ID_CONTEXT_HELP0xE145ID_HELP0xE146ID_DEFAULT_HELP0xE147ID_NEXT_PANE0xE150ID_PREV_PANE0xE151ID_FORMAT_FONT0xE160ID_OLE_INSERT_NEW0xE200ID_OLE_EDIT_LINKS0xE201ID_OLE_EDIT_CONVERT0xE202ID_OLE_EDIT_CHANGE_ICON0xE203ID_OLE_EDIT_PROPERTIES0xE204ID_OLE_VERB_FIRST0xE210AFX_ID_PREVIEW_CLOSE0xE300AFX_ID_PREVIEW_NUMPAGE0xE301AFX_ID_PREVIEW_NEXT0xE302AFX_ID_PREVIEW_PREV0xE303AFX_ID_PREVIEW_PRINT0xE304AFX_ID_PREVIEW_ZOOMIN0xE305AFX_ID_PREVIEW_ZOOMOUT0xE306ID_INDICATOR_EXT0xE700ID_INDICATOR_CAPS0xE701ID_INDICATOR_NUM0xE702ID_INDICATOR_SCRL0xE703ID_INDICATOR_OVR0xE704ID_INDICATOR_REC0xE705ID_INDICATOR_KANA0xE706ID_VIEW_TOOLBAR0xE800ID_VIEW_STATUS_BAR0xE801ID_VIEW_REBAR0xE804ID_VIEW_AUTOARRANGE0xE805ID_VIEW_SMALLICON0xE810ID_VIEW_LARGEICON0xE811ID_VIEW_LIST0xE812ID_VIEW_DETAILS0xE813ID_VIEW_LINEUP0xE814ID_VIEW_BYNAME0xE815ID_RECORD_FIRST0xE900ID_RECORD_LAST0xE901ID_RECORD_NEXT0xE902ID_RECORD_PREV0xE903AFX_IDS_SCSIZE0xEF00AFX_IDS_SCMOVE0xEF01AFX_IDS_SCMINIMIZE0xEF02AFX_IDS_SCMAXIMIZE0xEF03AFX_IDS_SCNEXTWINDOW0xEF04AFX_IDS_SCPREVWINDOW0xEF05AFX_IDS_SCCLOSE0xEF06AFX_IDS_SCRESTORE0xEF12AFX_IDS_SCTASKLIST0xEF13AFX_IDS_MDICHILD0xEF1FAFX_IDS_DESKACCESSORY0xEFDAAFX_IDS_OPENFILE0xF000AFX_IDS_SAVEFILE0xF001AFX_IDS_ALLFILTER0xF002AFX_IDS_UNTITLED0xF003AFX_IDS_SAVEFILECOPY0xF004AFX_IDS_PREVIEW_CLOSE0xF005AFX_IDS_UNNAMED_FILE0xF006AFX_IDS_HIDE0xF011AFX_IDP_NO_ERROR_AVAILABLE0xF020AFX_IDS_NOT_SUPPORTED_EXCEPTION0xF021AFX_IDS_RESOURCE_EXCEPTION0xF022AFX_IDS_MEMORY_EXCEPTION0xF023AFX_IDS_USER_EXCEPTION0xF024AFX_IDS_PRINTONPORT0xF040AFX_IDS_ONEPAGE0xF041AFX_IDS_TWOPAGE0xF042AFX_IDS_PRINTPAGENUM0xF043AFX_IDS_PREVIEWPAGEDESC0xF044AFX_IDS_PRINTDEFAULTEXT0xF045AFX_IDS_PRINTDEFAULT0xF046AFX_IDS_PRINTFILTER0xF047AFX_IDS_PRINTCAPTION0xF048AFX_IDS_PRINTTOFILE0xF049AFX_IDS_OBJECT_MENUITEM0xF080AFX_IDS_EDIT_VERB0xF081AFX_IDS_ACTIVATE_VERB0xF082AFX_IDS_CHANGE_LINK0xF083AFX_IDS_AUTO0xF084AFX_IDS_MANUAL0xF085AFX_IDS_FROZEN0xF086AFX_IDS_ALL_FILES0xF087AFX_IDS_SAVE_MENU0xF088AFX_IDS_UPDATE_MENU0xF089AFX_IDS_SAVE_AS_MENU0xF08AAFX_IDS_SAVE_COPY_AS_MENU0xF08BAFX_IDS_EXIT_MENU0xF08CAFX_IDS_UPDATING_ITEMS0xF08DAFX_IDS_METAFILE_FORMAT0xF08EAFX_IDS_DIB_FORMAT0xF08FAFX_IDS_BITMAP_FORMAT0xF090AFX_IDS_LINKSOURCE_FORMAT0xF091AFX_IDS_EMBED_FORMAT0xF092AFX_IDS_PASTELINKEDTYPE0xF094AFX_IDS_UNKNOWNTYPE0xF095AFX_IDS_RTF_FORMAT0xF096AFX_IDS_TEXT_FORMAT0xF097AFX_IDS_INVALID_CURRENCY0xF098AFX_IDS_INVALID_DATETIME0xF099AFX_IDS_INVALID_DATETIMESPAN0xF09AAFX_IDP_INVALID_FILENAME0xF100AFX_IDP_FAILED_TO_OPEN_DOC0xF101AFX_IDP_FAILED_TO_SAVE_DOC0xF102AFX_IDP_ASK_TO_SAVE0xF103AFX_IDP_FAILED_TO_CREATE_DOC0xF104AFX_IDP_FILE_TOO_LARGE0xF105AFX_IDP_FAILED_TO_START_PRINT0xF106AFX_IDP_FAILED_TO_LAUNCH_HELP0xF107AFX_IDP_INTERNAL_FAILURE0xF108AFX_IDP_COMMAND_FAILURE0xF109AFX_IDP_FAILED_MEMORY_ALLOC0xF10AAFX_IDP_UNREG_DONE0xF10BAFX_IDP_UNREG_FAILURE0xF10CAFX_IDP_DLL_LOAD_FAILED0xF10DAFX_IDP_DLL_BAD_VERSION0xF10EAFX_IDP_PARSE_INT0xF110AFX_IDP_PARSE_REAL0xF111AFX_IDP_PARSE_INT_RANGE0xF112AFX_IDP_PARSE_REAL_RANGE0xF113AFX_IDP_PARSE_STRING_SIZE0xF114AFX_IDP_PARSE_RADIO_BUTTON0xF115AFX_IDP_PARSE_BYTE0xF116AFX_IDP_PARSE_UINT0xF117AFX_IDP_PARSE_DATETIME0xF118AFX_IDP_PARSE_CURRENCY0xF119AFX_IDP_FAILED_INVALID_FORMAT0xF120AFX_IDP_FAILED_INVALID_PATH0xF121AFX_IDP_FAILED_DISK_FULL0xF122AFX_IDP_FAILED_ACCESS_READ0xF123AFX_IDP_FAILED_ACCESS_WRITE0xF124AFX_IDP_FAILED_IO_ERROR_READ0xF125AFX_IDP_FAILED_IO_ERROR_WRITE0xF126AFX_IDP_STATIC_OBJECT0xF180AFX_IDP_FAILED_TO_CONNECT0xF181AFX_IDP_SERVER_BUSY0xF182AFX_IDP_BAD_VERB0xF183AFX_IDS_NOT_DOCOBJECT0xF184AFX_IDP_FAILED_TO_NOTIFY0xF185AFX_IDP_FAILED_TO_LAUNCH0xF186AFX_IDP_ASK_TO_UPDATE0xF187AFX_IDP_FAILED_TO_UPDATE0xF188AFX_IDP_FAILED_TO_REGISTER0xF189AFX_IDP_FAILED_TO_AUTO_REGISTER0xF18AAFX_IDP_FAILED_TO_CONVERT0xF18BAFX_IDP_GET_NOT_SUPPORTED0xF18CAFX_IDP_SET_NOT_SUPPORTED0xF18DAFX_IDP_ASK_TO_DISCARD0xF18EAFX_IDP_FAILED_TO_CREATE0xF18FAFX_IDP_FAILED_MAPI_LOAD0xF190AFX_IDP_INVALID_MAPI_DLL0xF191AFX_IDP_FAILED_MAPI_SEND0xF192AFX_IDP_FILE_NONE0xF1A0AFX_IDP_FILE_GENERIC0xF1A1AFX_IDP_FILE_NOT_FOUND0xF1A2AFX_IDP_FILE_BAD_PATH0xF1A3AFX_IDP_FILE_TOO_MANY_OPEN0xF1A4AFX_IDP_FILE_ACCESS_DENIED0xF1A5AFX_IDP_FILE_INVALID_FILE0xF1A6AFX_IDP_FILE_REMOVE_CURRENT0xF1A7AFX_IDP_FILE_DIR_FULL0xF1A8AFX_IDP_FILE_BAD_SEEK0xF1A9AFX_IDP_FILE_HARD_IO0xF1AAAFX_IDP_FILE_SHARING0xF1ABAFX_IDP_FILE_LOCKING0xF1ACAFX_IDP_FILE_DISKFULL0xF1ADAFX_IDP_FILE_EOF0xF1AEAFX_IDP_ARCH_NONE0xF1B0AFX_IDP_ARCH_GENERIC0xF1B1AFX_IDP_ARCH_READONLY0xF1B2AFX_IDP_ARCH_ENDOFFILE0xF1B3AFX_IDP_ARCH_WRITEONLY0xF1B4AFX_IDP_ARCH_BADINDEX0xF1B5AFX_IDP_ARCH_BADCLASS0xF1B6AFX_IDP_ARCH_BADSCHEMA0xF1B7AFX_IDS_OCC_SCALEUNITS_PIXELS0xF1C0AFX_IDS_STATUS_FONT0xF230AFX_IDS_TOOLTIP_FONT0xF231AFX_IDS_UNICODE_FONT0xF232AFX_IDS_MINI_FONT0xF233AFX_IDP_SQL_CONNECT_FAIL0xF281AFX_IDP_SQL_RECORDSET_FORWARD_ONLY0xF282AFX_IDP_SQL_EMPTY_COLUMN_LIST0xF283AFX_IDP_SQL_FIELD_SCHEMA_MISMATCH0xF284AFX_IDP_SQL_ILLEGAL_MODE0xF285AFX_IDP_SQL_MULTIPLE_ROWS_AFFECTED0xF286AFX_IDP_SQL_NO_CURRENT_RECORD0xF287AFX_IDP_SQL_NO_ROWS_AFFECTED0xF288AFX_IDP_SQL_RECORDSET_READONLY0xF289AFX_IDP_SQL_SQL_NO_TOTAL0xF28AAFX_IDP_SQL_ODBC_LOAD_FAILED0xF28BAFX_IDP_SQL_DYNASET_NOT_SUPPORTED0xF28CAFX_IDP_SQL_SNAPSHOT_NOT_SUPPORTED0xF28DAFX_IDP_SQL_API_CONFORMANCE0xF28EAFX_IDP_SQL_SQL_CONFORMANCE0xF28FAFX_IDP_SQL_NO_DATA_FOUND0xF290AFX_IDP_SQL_ROW_UPDATE_NOT_SUPPORTED0xF291AFX_IDP_SQL_ODBC_V2_REQUIRED0xF292AFX_IDP_SQL_NO_POSITIONED_UPDATES0xF293AFX_IDP_SQL_LOCK_MODE_NOT_SUPPORTED0xF294AFX_IDP_SQL_DATA_TRUNCATED0xF295AFX_IDP_SQL_ROW_FETCH0xF296AFX_IDP_SQL_INCORRECT_ODBC0xF297AFX_IDP_SQL_UPDATE_DELETE_FAILED0xF298AFX_IDP_SQL_DYNAMIC_CURSOR_NOT_SUPPORTED0xF299AFX_IDP_SQL_FIELD_NOT_FOUND0xF29AAFX_IDP_SQL_BOOKMARKS_NOT_SUPPORTED0xF29BAFX_IDP_SQL_BOOKMARKS_NOT_ENABLED0xF29CAFX_IDS_DELETED0xF29DAFX_IDP_DAO_ENGINE_INITIALIZATION0xF2B0AFX_IDP_DAO_DFX_BIND0xF2B1AFX_IDP_DAO_OBJECT_NOT_OPEN0xF2B2AFX_IDP_DAO_ROWTOOSHORT0xF2B3AFX_IDP_DAO_BADBINDINFO0xF2B4AFX_IDP_DAO_COLUMNUNAVAILABLE0xF2B5AFX_IDS_HTTP_TITLE0xF2D1AFX_IDS_HTTP_NO_TEXT0xF2D2AFX_IDS_HTTP_BAD_REQUEST0xF2D3AFX_IDS_HTTP_AUTH_REQUIRED0xF2D4AFX_IDS_HTTP_FORBIDDEN0xF2D5AFX_IDS_HTTP_NOT_FOUND0xF2D6AFX_IDS_HTTP_SERVER_ERROR0xF2D7AFX_IDS_HTTP_NOT_IMPLEMENTED0xF2D8AFX_IDS_PROPPAGE_UNKNOWN0xFE01AFX_IDS_COLOR_DESKTOP0xFE04AFX_IDS_COLOR_APPWORKSPACE0xFE05AFX_IDS_COLOR_WNDBACKGND0xFE06AFX_IDS_COLOR_WNDTEXT0xFE07AFX_IDS_COLOR_MENUBAR0xFE08AFX_IDS_COLOR_MENUTEXT0xFE09AFX_IDS_COLOR_ACTIVEBAR0xFE0AAFX_IDS_COLOR_INACTIVEBAR0xFE0BAFX_IDS_COLOR_ACTIVETEXT0xFE0CAFX_IDS_COLOR_INACTIVETEXT0xFE0DAFX_IDS_COLOR_ACTIVEBORDER0xFE0EAFX_IDS_COLOR_INACTIVEBORDER0xFE0FAFX_IDS_COLOR_WNDFRAME0xFE10AFX_IDS_COLOR_SCROLLBARS0xFE11AFX_IDS_COLOR_BTNFACE0xFE12AFX_IDS_COLOR_BTNSHADOW0xFE13AFX_IDS_COLOR_BTNTEXT0xFE14AFX_IDS_COLOR_BTNHIGHLIGHT0xFE15AFX_IDS_COLOR_DISABLEDTEXT0xFE16AFX_IDS_COLOR_HIGHLIGHT0xFE17AFX_IDS_COLOR_HIGHLIGHTTEXT0xFE18AFX_IDS_REGULAR0xFE19AFX_IDS_BOLD0xFE1AAFX_IDS_ITALIC0xFE1BAFX_IDS_BOLDITALIC0xFE1CAFX_IDS_SAMPLETEXT0xFE1DAFX_IDS_DISPLAYSTRING_FONT0xFE1EAFX_IDS_DISPLAYSTRING_COLOR0xFE1FAFX_IDS_DISPLAYSTRING_PICTURE0xFE20AFX_IDS_PICTUREFILTER0xFE21AFX_IDS_PICTYPE_UNKNOWN0xFE22AFX_IDS_PICTYPE_NONE0xFE23AFX_IDS_PICTYPE_BITMAP0xFE24AFX_IDS_PICTYPE_METAFILE0xFE25AFX_IDS_PICTYPE_ICON0xFE26AFX_IDS_COLOR_PPG0xFE28AFX_IDS_COLOR_PPG_CAPTION0xFE29AFX_IDS_FONT_PPG0xFE2AAFX_IDS_FONT_PPG_CAPTION0xFE2BAFX_IDS_PICTURE_PPG0xFE2CAFX_IDS_PICTURE_PPG_CAPTION0xFE2DAFX_IDS_PICTUREBROWSETITLE0xFE30AFX_IDS_BORDERSTYLE_00xFE31AFX_IDS_BORDERSTYLE_10xFE32AFX_IDS_VERB_EDIT0xFE40AFX_IDS_VERB_PROPERTIES0xFE41AFX_IDP_PICTURECANTOPEN0xFE83AFX_IDP_PICTURECANTLOAD0xFE84AFX_IDP_PICTURETOOLARGE0xFE85AFX_IDP_PICTUREREADFAILED0xFE86AFX_IDP_E_ILLEGALFUNCTIONCALL0xFEA0AFX_IDP_E_OVERFLOW0xFEA1AFX_IDP_E_OUTOFMEMORY0xFEA2AFX_IDP_E_DIVISIONBYZERO0xFEA3AFX_IDP_E_OUTOFSTRINGSPACE0xFEA4AFX_IDP_E_OUTOFSTACKSPACE0xFEA5AFX_IDP_E_BADFILENAMEORNUMBER0xFEA6AFX_IDP_E_FILENOTFOUND0xFEA7AFX_IDP_E_BADFILEMODE0xFEA8AFX_IDP_E_FILEALREADYOPEN0xFEA9AFX_IDP_E_DEVICEIOERROR0xFEAAAFX_IDP_E_FILEALREADYEXISTS0xFEABAFX_IDP_E_BADRECORDLENGTH0xFEACAFX_IDP_E_DISKFULL0xFEADAFX_IDP_E_BADRECORDNUMBER0xFEAEAFX_IDP_E_BADFILENAME0xFEAFAFX_IDP_E_TOOMANYFILES0xFEB0AFX_IDP_E_DEVICEUNAVAILABLE0xFEB1AFX_IDP_E_PERMISSIONDENIED0xFEB2AFX_IDP_E_DISKNOTREADY0xFEB3AFX_IDP_E_PATHFILEACCESSERROR0xFEB4AFX_IDP_E_PATHNOTFOUND0xFEB5AFX_IDP_E_INVALIDPATTERNSTRING0xFEB6AFX_IDP_E_INVALIDUSEOFNULL0xFEB7AFX_IDP_E_INVALIDFILEFORMAT0xFEB8AFX_IDP_E_INVALIDPROPERTYVALUE0xFEB9AFX_IDP_E_INVALIDPROPERTYARRAYINDEX0xFEBAAFX_IDP_E_SETNOTSUPPORTEDATRUNTIME0xFEBBAFX_IDP_E_SETNOTSUPPORTED0xFEBCAFX_IDP_E_NEEDPROPERTYARRAYINDEX0xFEBDAFX_IDP_E_SETNOTPERMITTED0xFEBEAFX_IDP_E_GETNOTSUPPORTEDATRUNTIME0xFEBFAFX_IDP_E_GETNOTSUPPORTED0xFEC0AFX_IDP_E_PROPERTYNOTFOUND0xFEC1AFX_IDP_E_INVALIDCLIPBOARDFORMAT0xFEC2AFX_IDP_E_INVALIDPICTURE0xFEC3AFX_IDP_E_PRINTERERROR0xFEC4AFX_IDP_E_CANTSAVEFILETOTEMP0xFEC5AFX_IDP_E_SEARCHTEXTNOTFOUND0xFEC6AFX_IDP_E_REPLACEMENTSTOOLONG0xFEC7IDC_STATIC-14TEXTINCLUDE0 ..\resource.h4TEXTINCLUDE0 #include "afxres.h" 4TEXTINCLUDE0 #define _AFX_NO_SPLITTER_RESOURCES #define _AFX_NO_OLE_RESOURCES #define _AFX_NO_TRACKER_RESOURCES #define _AFX_NO_PROPERTY_RESOURCES #include "afxres.rc" // Standard components , 0 ,4VS_VERSION_INFO? StringFileInfoh040904b0 CompanyName(FileDescription FileVersion InternalName$LegalCopyright(OriginalFilename8 ProductNamePluckerCond$ProductVersion SpecialBuildDVarFileInfo$Translation DDESIGNINFOGUIDELINES0 e ,0f \0EGqEG+ 0 ȐChange HotSync ActionMS Sans SerifXH"O &Synchronize the filesPH<l &Desktop overwrites handheldXHVl &Handheld overwrites DesktopPHp0 Do &nothingPJ: Set &as defaultP 2OKP2CancelP+2 &HelpP|<PlaceHolder>P gP8 hPR iPl jP TP Mobile OptionsP/ Sync Timing@Z}  @l !PAAF e0 ȐChange HotSync ActionMS Sans SerifXHPO &Synchronize the filesPHjl &Desktop overwrites handheldXHl &Handheld overwrites DesktopPH0 Do &nothingPx: Set &as defaultP92OKPI2CancelPY2 &HelpP6|<Conduit Name HotSync Action Place Holder>PL gPf hP iP jP,<User's Current Settings Place Holder>PMDefault HotSync Action:PgStaticP$MNext HotSync Action:Pg$Static f0 @2TP Mobile ProgressMS Sans SerifPb2CancelP Working j0 (0@wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxwwwwwwwwwwwwwwxwwxwwwwwwwwwwwwwwxwwwwwwwwwwxwwwwwwwwwwxwwwwwwwwwwwwwwwwxwwwwwwwwwwxwwwwwwwxwwwwwwwwwwwwxwwwwwxwwwxwwwwwwwwwwxwwwwwwwxwwwwwwxwwwwxwwwwwwwwxxwwwwwwwxwwwwwwwxxwwwwxwwwwwwwxxwwwwwwwxwwwwwwwwxxwwwwwwwwwwwwwwxxwwwwwwwwwwwwxwwwwxwwwwwwwwwwwwwxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww i0 (0@wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxwwxwwwwwwwxwwwwwwwwwwwwwwwxwwwwwwwwwwxwwwwwwwwwwxwwwwwwwwwgwwwwwxwwwwwwwvvwwwwxwwwwwwwwwggflwxwwwwvvfwwwwwwxwwwwggflwxwwwwwwvvfwwwwxxwwwwwgflwwwxxwwwwwwwwwwwwwxxwwwwwwwwwwwxxwwwwwwwwwwwwwwxxwwwwwwwwwwwwxwwwwwwwwwwwwwwwwxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww h0 (0@wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwpwwwwwwwwwwwwwwpwwwwwwwwwwwwwwwwwxwwwwwwwwpwwwwwwwwwwp33333wwwwwwwwwwp333wwwwwwwwwwpwwwwwwxwwwwwwwpwwwwwwxwwwwwwww33330wwwxwwwwwwww0wwwwwwxwww|wwwv0wwwxwwwwwgg0wwwwwwxww|fvv0wwwxwwlfgg0wwwwwwxw|fvv0wwwwwlfgg0wwwww|fvwwwwwxwwwwwwwwwwwwwwwwwwwww|wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww g0 (0@wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxwwwwwwwwwwwwwwwwxwwwwwwwwwwwwwwpwwwwwwwwpwwwwwwwwwwwwwwwwwww333330wwwwwwwww33300wwwflwww0wwwfwwwwwwwwflwwp3333wwwwfwwpwwwwwwfl|wpwwwwwwwf`wwwwwww|`xwwwwwwwf`wxwwwwwww|`wwwwwwwwf`wwwwwwww|wpwwwwwwwwwwwwwwwwpwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww> 0 Plucker Conduitx 0 ,Please check your connections and try again. 0 PYour Palm organizer may be full. Check the Palm organizer's Memory Application.GYour Desktop disk may be full. Check the disk space and HotSync again.9Could not copy the following record to Palm organizer: %s9Could not purge the deleted records on Palm organizer. %s;Could not delete the following record on Palm organizer: %s;Could not modify the following record on Palm organizer: %s6Could not copy the following record to the Desktop: %sHCould not move the Palm organizer records in category '%s' to 'Unfiled'..Could not read the next Palm organizer record.]Only 15 categories are allowed. All records in remote category %s were changed to 'Unfiled'.b-- Remote category %s has been deleted. The records in this category have been moved to 'Unfiled'.~ 0 The following record was modified on both Palm organizer and the Desktop: %s. This record will be duplicated on each platform. Delete the unwanted record and HotSync again.The following record was modified on both Palm organizer and the Desktop: %s. This record will be duplicated on each platform. The following record, %s, was modified on one platform and deleted on the other. The modified version will appear on both platforms.Some Palm organizer records were not copied to the Desktop. Your computer may be full or you may have reached the maximum allowed records on the desktop. To correct this situation, delete some records and HotSync again.Some Desktop records were not copied to Palm organizer. Your Palm organizer may be full. To correct this situation, delete some records and HotSync again.A custom label was modified on the Desktop and Palm organizer. The Palm organizer label '%1s' was overwritten by the Desktop label '%2s' 0 3Records may not be sorted correctly on the Desktop.6Some or all of your deleted records were not archived.<Could not clear Palm organizer's status flags. Error Code %sThe following record in a subscription category was modified: %s. This record may be duplicated if it exists in the subscription source file. 0  - <Record count mismatch. %1l local records, %2l remote recordsFatal Error %l.=Could not purge the deleted records on Desktop. Error Code %s4 -- Could not save the local database. Error Code %sD -- Could not clear Desktop's Database's status flags. Error Code %s2 -- Could not close remote database. Error Code %s1 -- Could not close local database. Error Code %sa-- Local category %s has been deleted. The records in this category have been moved to 'Unfiled'.?Could not move the local records in category '%s' to 'Unfiled'.\Only 15 categories are allowed. All records in local category %s were changed to 'Unfiled'.=DB Name %1s, Creator ID %2s, Type %3u, Flags %4d, Version %5dDB Name %1s, Creator ID %2s0 -- Failed to create PC Database: %1s, Error %2u0 -- Failed to create HH Database: %1s, Error %2u+ -- PC failed to add record: %1s, Error %2u\ 0 + -- HH failed to add record: %1s, Error %2u, -- PC failed to read record: %1s, Error %2u, -- HH failed to read record: %1s, Error %2u Record ID %uRecord Index %uZ 0 %s's Current Settings:Synchronize the files."Desktop overwrites Palm organizer."Palm organizer overwrites Desktop. Do Nothing."HotSync Action for Generic Conduit 0 $HWB4DHWB DHWB0 `EHWB0  FHWB0 t@QHWB/0 AQHWB-0 5B@SHWB.0 TEXTINCLUDE0 TEXTINCLUDE0 <TEXTINCLUDE0 ,0 DESIGNINFOGUIDELINES0 80 Fe0 Hf0 j0 ܥi0 h0 lg0 >40 x0 ,0 ~@0 0 0 \T0 Z0  L0 plucker-1.8/tools/plucker-conduit/msw/r_englsh/PluckerCond.rc0100644000076400001440000003077207621473073023503 0ustar mickeusers//Microsoft Developer Studio generated resource script. // #include "..\resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "..\\resource.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "#define _AFX_NO_SPLITTER_RESOURCES\r\n" "#define _AFX_NO_OLE_RESOURCES\r\n" "#define _AFX_NO_TRACKER_RESOURCES\r\n" "#define _AFX_NO_PROPERTY_RESOURCES\r\n" "#include ""afxres.rc"" // Standard components\r\n" END #endif // APSTUDIO_INVOKED #ifndef _MAC ///////////////////////////////////////////////////////////////////////////// // // Version // VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,0,1 PRODUCTVERSION 1,0,0,1 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x21L #else FILEFLAGS 0x20L #endif FILEOS 0x4L FILETYPE 0x2L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "CompanyName", "\0" VALUE "FileDescription", "\0" VALUE "FileVersion", "\0" VALUE "InternalName", "\0" VALUE "LegalCopyright", "\0" VALUE "OriginalFilename", "\0" VALUE "ProductName", "PluckerCond\0" VALUE "ProductVersion", "\0" VALUE "SpecialBuild", "\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END #endif // !_MAC ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO DISCARDABLE BEGIN IDD_CONDUIT_CFG_DETAILED, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 248 TOPMARGIN, 7 BOTTOMMARGIN, 113 END IDD_DIALOG_PROGRESS, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 241 TOPMARGIN, 7 BOTTOMMARGIN, 43 END END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_CONDUIT_ACTION DIALOG DISCARDABLE 0, 0, 262, 167 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Change HotSync Action" FONT 8, "MS Sans Serif" BEGIN RADIOBUTTON "&Synchronize the files",IDC_RADIO_SYNC,72,34,79,10, WS_DISABLED | WS_GROUP | WS_TABSTOP RADIOBUTTON "&Desktop overwrites handheld",IDC_RADIO_PCTOHH,72,60, 108,10 RADIOBUTTON "&Handheld overwrites Desktop",IDC_RADIO_HHTOPC,72,86, 108,10,WS_DISABLED RADIOBUTTON "Do ¬hing",IDC_RADIO_DONOTHING,72,112,48,10 CONTROL "Set &as default",IDC_MAKEDEFAULT,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,196,74,58,10 DEFPUSHBUTTON "OK",IDOK,196,11,50,14 PUSHBUTTON "Cancel",IDCANCEL,196,27,50,14 PUSHBUTTON "&Help",9,196,43,50,14 GROUPBOX "",IDC_ACTIONGROUPBOXTEXT,8,8,177,124, WS_GROUP CONTROL 103,IDC_SYNC,"Static",SS_BITMAP,14,30,32,15 CONTROL 104,IDC_PCTOHH,"Static",SS_BITMAP,14,56,32,15 CONTROL 105,IDC_HHTOPC,"Static",SS_BITMAP,14,82,32,15 CONTROL 106,IDC_DONOTHING,"Static",SS_BITMAP,14,108,32,15 GROUPBOX "TP Mobile Options",IDC_STATIC,9,135,249,30 LTEXT "Sync Timing",IDC_STATIC,15,146,47,12,SS_CENTERIMAGE EDITTEXT IDC_EDIT_STARTURL,135,90,125,12,ES_AUTOHSCROLL | NOT WS_VISIBLE EDITTEXT IDC_EDIT_DEPTH,235,108,24,12,ES_AUTOHSCROLL | ES_NUMBER | NOT WS_VISIBLE COMBOBOX IDC_EDIT_SELECTION,65,145,184,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END IDD_CONDUIT_CFG_DETAILED DIALOG DISCARDABLE 0, 0, 262, 186 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Change HotSync Action" FONT 8, "MS Sans Serif" BEGIN RADIOBUTTON "&Synchronize the files",IDC_RADIO_SYNC,72,80,79,10, WS_DISABLED | WS_GROUP | WS_TABSTOP RADIOBUTTON "&Desktop overwrites handheld",IDC_RADIO_PCTOHH,72,106, 108,10 RADIOBUTTON "&Handheld overwrites Desktop",IDC_RADIO_HHTOPC,72,132, 108,10,WS_DISABLED RADIOBUTTON "Do ¬hing",IDC_RADIO_DONOTHING,72,158,48,10 CONTROL "Set &as default",IDC_MAKEDEFAULT,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,196,120,58,10 DEFPUSHBUTTON "OK",IDOK,196,57,50,14 PUSHBUTTON "Cancel",IDCANCEL,196,73,50,14 PUSHBUTTON "&Help",9,196,89,50,14 GROUPBOX "", IDC_ACTIONGROUPBOXTEXT,8,54,177,124,WS_GROUP CONTROL 103,IDC_SYNC,"Static",SS_BITMAP,14,76,32,15 CONTROL 104,IDC_PCTOHH,"Static",SS_BITMAP,14,102,32,15 CONTROL 105,IDC_HHTOPC,"Static",SS_BITMAP,14,128,32,15 CONTROL 106,IDC_DONOTHING,"Static",SS_BITMAP,14,154,32,15 GROUPBOX "",1006,8,8,238,44 LTEXT "Default HotSync Action:",IDC_STATIC,14,23,77,8 LTEXT "Static",1004,103,23,131,8 LTEXT "Next HotSync Action:",IDC_STATIC,14,36,77,8 LTEXT "Static",1005,103,36,131,8 END IDD_DIALOG_PROGRESS DIALOG DISCARDABLE 0, 0, 248, 50 STYLE DS_CENTER | WS_POPUP | WS_CAPTION CAPTION "TP Mobile Progress" FONT 8, "MS Sans Serif" BEGIN PUSHBUTTON "Cancel",IDCANCEL,98,30,50,14 LTEXT "Working",IDC_STATIC_PROGRESS,15,10,210,15 END ///////////////////////////////////////////////////////////////////////////// // // Bitmap // IDB_DONOTHING BITMAP DISCARDABLE "Res\\Sync3.bmp" IDB_HHTOPC BITMAP DISCARDABLE "Res\\Sync2.bmp" IDB_PCTOHH BITMAP DISCARDABLE "Res\\Sync1.bmp" IDB_SYNC BITMAP DISCARDABLE "Res\\Sync0.bmp" ///////////////////////////////////////////////////////////////////////////// // // Dialog Info // IDD_CONDUIT_ACTION DLGINIT BEGIN IDC_EDIT_SELECTION, 0x403, 1, 0 "\000" 0 END ///////////////////////////////////////////////////////////////////////////// // // String Table // STRINGTABLE DISCARDABLE BEGIN IDS_CONDUIT_NAME "Plucker Conduit" END STRINGTABLE DISCARDABLE BEGIN IDS_CONNECTION "Please check your connections and try again." END STRINGTABLE DISCARDABLE BEGIN IDS_DEVICE_FULL "Your Palm organizer may be full. Check the Palm organizer's Memory Application." IDS_DESKTOP_FULL "Your Desktop disk may be full. Check the disk space and HotSync again." IDS_BAD_ADD_REC "Could not copy the following record to Palm organizer: %s" IDS_BAD_PURGE_REMOTE "Could not purge the deleted records on Palm organizer. %s" IDS_BAD_DEL_REC "Could not delete the following record on Palm organizer: %s" IDS_BAD_CHANGE_REC "Could not modify the following record on Palm organizer: %s" IDS_BAD_LOCALADD_REC "Could not copy the following record to the Desktop: %s" IDS_REMOTE_BAD_CHANGE_CAT "Could not move the Palm organizer records in category '%s' to 'Unfiled'." IDS_BAD_READ_RECORD "Could not read the next Palm organizer record." IDS_REMOTE_TOOMANY_CATS "Only 15 categories are allowed. All records in remote category %s were changed to 'Unfiled'." IDS_REMOTE_CAT_DELETED "-- Remote category %s has been deleted. The records in this category have been moved to 'Unfiled'." END STRINGTABLE DISCARDABLE BEGIN IDS_DOUBLE_MODIFIED "The following record was modified on both Palm organizer and the Desktop: %s. This record will be duplicated on each platform. Delete the unwanted record and HotSync again." IDS_ARCH_DOUBLE_MOD1 "The following record was modified on both Palm organizer and the Desktop: %s. This record will be duplicated on each platform. " IDS_REVERSE_DELETE "The following record, %s, was modified on one platform and deleted on the other. The modified version will appear on both platforms." IDS_RECCOUNT_DESKTOP1 "Some Palm organizer records were not copied to the Desktop. Your computer may be full or you may have reached the maximum allowed records on the desktop. To correct this situation, delete some records and HotSync again." IDS_RECCOUNT_PILOT1 "Some Desktop records were not copied to Palm organizer. Your Palm organizer may be full. To correct this situation, delete some records and HotSync again." IDS_CUSTOM_LABEL "A custom label was modified on the Desktop and Palm organizer. The Palm organizer label '%1s' was overwritten by the Desktop label '%2s'" END STRINGTABLE DISCARDABLE BEGIN IDS_BAD_XMAP "Records may not be sorted correctly on the Desktop." IDS_BAD_ARCHIVE_ERR "Some or all of your deleted records were not archived." IDS_BAD_RESET_FLAGS_REMOTE "Could not clear Palm organizer's status flags. Error Code %s" IDS_DOUBLE_MODIFY_SUBSC1 "The following record in a subscription category was modified: %s. This record may be duplicated if it exists in the subscription source file." END STRINGTABLE DISCARDABLE BEGIN IDS_LOG_SPACING " - " IDS_RECORD_COUNT_MISMATCH "Record count mismatch. %1l local records, %2l remote records" IDS_UNKNOWN_FATAL_ERROR "Fatal Error %l." IDS_BAD_PURGE_LOCAL "Could not purge the deleted records on Desktop. Error Code %s" IDS_BAD_LOCAL_SAVE " -- Could not save the local database. Error Code %s" IDS_BAD_RESET_FLAGS_LOCAL " -- Could not clear Desktop's Database's status flags. Error Code %s" IDS_BAD_CLOSE_DB_REMOTE " -- Could not close remote database. Error Code %s" IDS_BAD_CLOSE_DB_LOCAL " -- Could not close local database. Error Code %s" IDS_LOCAL_CAT_DELETED "-- Local category %s has been deleted. The records in this category have been moved to 'Unfiled'." IDS_LOCAL_BAD_CHANGE_CAT "Could not move the local records in category '%s' to 'Unfiled'." IDS_LOCAL_TOOMANY_CATS "Only 15 categories are allowed. All records in local category %s were changed to 'Unfiled'." IDS_DATABASE_DESCRIPTION "DB Name %1s, Creator ID %2s, Type %3u, Flags %4d, Version %5d" IDS_DATABASE_SHORT_DESC "DB Name %1s, Creator ID %2s" IDS_PC_DB_CREATE_FAILURE " -- Failed to create PC Database: %1s, Error %2u" IDS_HH_DB_CREATE_FAILURE " -- Failed to create HH Database: %1s, Error %2u" IDS_PC_ADD_RECORD_ERROR " -- PC failed to add record: %1s, Error %2u" END STRINGTABLE DISCARDABLE BEGIN IDS_HH_ADD_RECORD_ERROR " -- HH failed to add record: %1s, Error %2u" IDS_PC_READ_REC_ERROR " -- PC failed to read record: %1s, Error %2u" IDS_HH_READ_REC_ERROR " -- HH failed to read record: %1s, Error %2u" IDS_RECORD_DESC_ID "Record ID %u" IDS_RECORD_DESC_INDEX "Record Index %u" END STRINGTABLE DISCARDABLE BEGIN IDS_CURRENT_SETTINGS_GROUP "%s's Current Settings:" IDS_SYNC_FILES "Synchronize the files." IDS_PCTOHH "Desktop overwrites Palm organizer." IDS_HHTOPC "Palm organizer overwrites Desktop." IDS_DO_NOTHING "Do Nothing." IDS_SYNC_ACTION_TEXT "HotSync Action for Generic Conduit" END #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // #define _AFX_NO_SPLITTER_RESOURCES #define _AFX_NO_OLE_RESOURCES #define _AFX_NO_TRACKER_RESOURCES #define _AFX_NO_PROPERTY_RESOURCES #include "afxres.rc" // Standard components ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED plucker-1.8/tools/plucker-conduit/msw/resource.h0100644000076400001440000000752707621473073021145 0ustar mickeusers//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by C:\Projects\PluckerCond\r_englsh\PluckerCond.rc // #define IDS_CONDUIT_NAME 1 #define IDD_CONDUIT_CFG_DETAILED 101 #define IDD_DIALOG_PROGRESS 102 #define IDB_SYNC 103 #define IDB_PCTOHH 104 #define IDB_HHTOPC 105 #define IDB_DONOTHING 106 #define IDD_CONDUIT_ACTION 399 #define IDC_ACTIONGROUPBOXTEXT 403 #define IDC_RADIO_SYNC 404 #define IDC_RADIO_PCTOHH 405 #define IDC_RADIO_HHTOPC 406 #define IDC_RADIO_DONOTHING 407 #define IDC_MAKEDEFAULT 411 #define IDC_SYNC 1000 #define IDC_PCTOHH 1001 #define IDC_HHTOPC 1002 #define IDC_DONOTHING 1003 #define IDC_STATIC_PROGRESS 1003 #define IDC_STATIC_PERMANENT 1004 #define IDC_STATIC_TEMPORARY 1005 #define IDC_CURRENT_SETTINGS_GROUP 1006 #define IDC_EDIT_STARTURL 1008 #define IDC_EDIT_DEPTH 1009 #define IDC_EDIT_SELECTION 1010 #define IDSTR_FIRSTLOG 3300 #define IDS_CONNECTION 3311 #define IDS_DEVICE_FULL 3312 #define IDS_DESKTOP_FULL 3313 #define IDS_BAD_ADD_REC 3315 #define IDS_BAD_PURGE_REMOTE 3316 #define IDS_BAD_DEL_REC 3317 #define IDS_BAD_CHANGE_REC 3318 #define IDS_BAD_LOCALADD_REC 3319 #define IDS_REMOTE_BAD_CHANGE_CAT 3320 #define IDS_BAD_READ_RECORD 3322 #define IDS_REMOTE_TOOMANY_CATS 3323 #define IDS_REMOTE_CAT_DELETED 3325 #define IDS_DOUBLE_MODIFIED 3328 #define IDS_ARCH_DOUBLE_MOD1 3331 #define IDS_REVERSE_DELETE 3334 #define IDS_RECCOUNT_DESKTOP1 3338 #define IDS_RECCOUNT_PILOT1 3341 #define IDS_CUSTOM_LABEL 3343 #define IDS_BAD_XMAP 3345 #define IDS_BAD_ARCHIVE_ERR 3346 #define IDS_BAD_RESET_FLAGS_REMOTE 3348 #define IDS_DOUBLE_MODIFY_SUBSC1 3358 #define IDS_LOG_SPACING 3360 #define IDS_RECORD_COUNT_MISMATCH 3361 #define IDS_UNKNOWN_FATAL_ERROR 3362 #define IDS_BAD_PURGE_LOCAL 3363 #define IDS_BAD_LOCAL_SAVE 3364 #define IDS_BAD_RESET_FLAGS_LOCAL 3365 #define IDS_BAD_CLOSE_DB_REMOTE 3366 #define IDS_BAD_CLOSE_DB_LOCAL 3367 #define IDS_LOCAL_CAT_DELETED 3368 #define IDS_LOCAL_BAD_CHANGE_CAT 3369 #define IDS_LOCAL_TOOMANY_CATS 3370 #define IDS_DATABASE_DESCRIPTION 3371 #define IDS_DATABASE_SHORT_DESC 3372 #define IDS_PC_DB_CREATE_FAILURE 3373 #define IDS_HH_DB_CREATE_FAILURE 3374 #define IDS_PC_ADD_RECORD_ERROR 3375 #define IDS_HH_ADD_RECORD_ERROR 3376 #define IDS_PC_READ_REC_ERROR 3377 #define IDS_HH_READ_REC_ERROR 3378 #define IDS_RECORD_DESC_ID 3379 #define IDS_RECORD_DESC_INDEX 3380 #define IDSTR_LASTLOG 3600 #define IDS_ADDRESS_TABLESTRING 8002 #define IDS_CUSTOM_TERMINATOR 8003 #define IDS_CURRENT_SETTINGS_GROUP 8004 #define IDS_SYNC_FILES 8005 #define IDS_PCTOHH 8006 #define IDS_HHTOPC 8007 #define IDS_DO_NOTHING 8008 #define IDS_SYNC_ACTION_TEXT 8009 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 104 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1011 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif plucker-1.8/tools/plucker-conduit/msw/BUILDING_MS_VISUAL_C.TXT0100644000076400001440000000174607774437364022700 0ustar mickeusersInstructions for MS Visual C++ 6.0: 1. Open up the PluckerCond.dsw file. 2. From menu: Project>Settings. In the resulting dialog box, select the top root level "Plucker Cond" in the left sidepane. 3. On the drop down menu at the top left of the dialog called "Settings for:", choose "Win32 Debug". 4. Select the C/C++ tab, and at the bottom of the tab there is a "Project options" box of commandline arguments for the make. Fix the include paths to the Palm Conduit Development Kit (CDK). For example, change "D:\CDK403" to "C:\palmdev\cdk403" or whatever it is on your system. 5. Now select the "Link" tab, and in the Project options at the bottom of this tab, also change the path to your sdk. [The palm sdk path is the last one listed in this textbox]. 6. On the drop down menu at the top left of the dialog called "Settings for:", choose "Win32 Release", and repeat steps 4 and 5. 7. Press OK to save settings. 8. From menu, choose Build>Rebuild All. plucker-1.8/tools/plucker-conduit/msw/README.txt0100644000076400001440000000235707621473073020637 0ustar mickeusersA Windows conduit for Plucker (www.plkr.org) Bill Nalen (bill@nalens.com) Copyright 2003 This conduit is licensed under the GPL license, see enclosed COPYING file for details. This conduit will sync channels from Plucker Desktop to your handheld. At Hotsync time, it will run Plucker Desktop to update all due channels and install the resulting databases onto your handheld. Note: For Plucker Desktop 1.2.0 you must select to have the console output option selected in the Options - Preferences - Spidering tab under Show Spider Progress, otherwise the Hotsync will hang. You also must pick any option except "Never Autoupdate" on the Options - Preferences - Autoupdate tab under Channel Autoupdate Mode. Working with programs other than Plucker Desktop JPluck Open or create a plucker.ini file Add the following entries [PLUCKER_DAEMON] autoupdate_mode=3 sync_commandline=java -jar path_to_jpluckc.jar\jpluckc.jar -settings Setting_to_use path_to_jxl\content_name.jxl You will also need to create the following registry entry HKey Current User\SOFTWARE\The Plucker Team\Plucker\Path as a string value where the value is the path to your plucker.ini file. This will allow the conduit to find the plucker.ini file and then find the command to run. plucker-1.8/tools/plucker-conduit/msw/PluckerCondGenCond.cpp0100644000076400001440000005754407621473073023324 0ustar mickeusers/***************************************************************************** * * EXPORTED FUNCTIONS Generic Conduit Entry Points Source File * ****************************************************************************/ #define STRICT 1 #define ASSERT(f) ((void)0) #define TRACE0(sz) #define TRACE(sz) #include #include #include #ifdef METROWERKS_WIN #include #else #include #endif #include #include #include #include #include #include #include #include "PluckerCondGenCond.h" //#include "PluckerCondSync.h" #include "resource.h" HANDLE hLangInstance; HANDLE hAppInstance; extern HANDLE hLangInstance; extern HANDLE hAppInstance; HINSTANCE gInstance; long CALLBACK ConfigureDlgProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam); void LoadCfgDlgBitmaps(HWND hDlg); ///////////////////////////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////////////////// // // Function: DllMain() // // Description: main entry point to the PluckerCond component // // Parameters: hInstance - instance handle of the DLL // dwReason - why the entry point was called // lpReserved - reserved // // Returns: 1 if okay // ///////////////////////////////////////////////////////////////////////////// // REVISION HISTORY: // 03/25/98 KRM inital // ///////////////////////////////////////////////////////////////////////////// #ifndef _68K_ static int iTerminationCount = 0; extern "C" int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { gInstance = hInstance; if (dwReason == DLL_PROCESS_ATTACH) { TRACE0("EXPORTED FUNCTIONS Initializing!\n"); if (!iTerminationCount ) { hAppInstance = hInstance; // use PalmLoadLanguage here to load different languages hLangInstance = hInstance; } ++iTerminationCount; } else if (dwReason == DLL_PROCESS_DETACH) { TRACE0("EXPORTED FUNCTIONS Terminating!\n"); --iTerminationCount; if (!iTerminationCount ) { // use PalmFreeLanguage here to unload different languages } } return 1; // ok } #endif ///////////////////////////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////////////////// // // Function: OpenConduit() // // Description: Extern "C" entry point into this conduit which starts the // process of synchronizing the local database table with // a remote conterpart residing on the remote view device. // // Parameters: Pointer to a callback function used to report progress. // // // // Returns: // ///////////////////////////////////////////////////////////////////////////// ExportFunc long OpenConduit(PROGRESSFN pFn, CSyncProperties& rProps) { long retval = 0; if (rProps.m_SyncType == eDoNothing) { LogAddEntry("OK Plucker - configured to do nothing", slSyncFinished, false); return retval; } // get location of ini file HKEY iniKey; LONG err = RegOpenKeyEx(HKEY_CURRENT_USER, "SOFTWARE\\The Plucker Team\\Plucker", 0, KEY_READ, &iniKey); if (err != ERROR_SUCCESS) { LogAddEntry("Plucker - could not find registry key for plucker.ini (has Plucker Desktop been installed?), update aborted.", slSyncAborted, false); return 1; } DWORD pluckerPathSize = 1024; DWORD type = REG_SZ; char pluckerPath[1024]; err = RegQueryValueEx(iniKey, "Path", NULL, &type, (LPBYTE) pluckerPath, &pluckerPathSize); if (err != ERROR_SUCCESS) { LogAddEntry("Plucker - could not find registry key for plucker.ini path (has Plucker Desktop been installed?), update aborted.", slSyncAborted, false); return 1; } RegCloseKey(iniKey); char iniFileName[1048]; strcpy(iniFileName, pluckerPath); strcat(iniFileName, "plucker.ini"); // see if we are supposed to run int autoUpdateMode = GetPrivateProfileInt("PLUCKER_DAEMON", "autoupdate_mode", 0, iniFileName); if (autoUpdateMode == 0) { LogAddEntry("Plucker - update turned off in Plucker Desktop", slSyncFinished, false); return retval; } // find command line to run char defaultCommand[2048]; strcpy(defaultCommand, pluckerPath); strcat(defaultCommand, "plucker_desktop\\plucker-desktop.exe --update-due"); char commandLine[2048]; GetPrivateProfileString("PLUCKER_DAEMON", "sync_commandline", defaultCommand, commandLine, 2048, iniFileName); // write current user WritePrivateProfileString("PLUCKER_DAEMON", "username_filter", rProps.m_UserName, iniFileName); if (strlen(commandLine) <= 0) { strcpy(commandLine, defaultCommand); } DWORD readErr; PROCESS_INFORMATION piProcInfo; STARTUPINFO siStartInfo; // Create child process ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) ); siStartInfo.cb = sizeof(STARTUPINFO); CreateProcess(NULL, commandLine, // command line NULL, // process security attributes NULL, // primary thread security attributes FALSE, CREATE_DEFAULT_ERROR_MODE | CREATE_NEW_PROCESS_GROUP | CREATE_NEW_CONSOLE, //0, // creation flags NULL, // use parent's environment NULL, // use parent's current directory &siStartInfo, // STARTUPINFO pointer &piProcInfo); // receives PROCESS_INFORMATION // wait for it to finish //HANDLE handles[1]; //handles[0] = piProcInfo.hProcess; //readErr = MsgWaitForMultipleObjects(1, handles, TRUE, 500, QS_ALLEVENTS); readErr = WaitForSingleObject(piProcInfo.hProcess, 1000); while (readErr == WAIT_TIMEOUT) { SyncYieldCycles(100); //readErr = MsgWaitForMultipleObjects(1, handles, TRUE, 500, QS_ALLEVENTS); readErr = WaitForSingleObject(piProcInfo.hProcess, 1000); } CloseHandle(piProcInfo.hProcess); LogAddFormattedEntry(slSyncFinished, false, "Plucker for %s", commandLine); return retval; } ///////////////////////////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////////////////// // // Function: GetConduitName() // // Description: Extern "C" entry point into this conduit which returns // the name to be used when display messages regarding // this conduit. // // Parameters: pszName - buffer in which to place the name // nLen - maximum number of bytes of buffer // // // // Returns: -1 indicates erros // ///////////////////////////////////////////////////////////////////////////// // REVISION HISTORY: // 03/25/98 KRM inital // ///////////////////////////////////////////////////////////////////////////// ExportFunc long GetConduitName(char* pszName,WORD nLen) { long retval = -1; if (::LoadString((HINSTANCE)hLangInstance, IDS_CONDUIT_NAME, pszName, nLen)) retval = 0; return retval; } ///////////////////////////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////////////////// // // Function: GetConduitVersion() // // Description: Extern "C" entry point into this conduit which returns // the conduits version // // Parameters: none // // Returns: DWORD indicating major and minor version number // HIWORD - reserved // HIBYTE(LOWORD) - major number // LOBYTE(LOWORD) - minor number // ///////////////////////////////////////////////////////////////////////////// // REVISION HISTORY: // 03/25/98 KRM inital ///////////////////////////////////////////////////////////////////////////// ExportFunc DWORD GetConduitVersion() { return GENERIC_CONDUIT_VERSION; } ///////////////////////////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////////////////// // // Function: ConfigureConduit // // Description: Extern "C" entry point into this conduit which returns // should display the UI necessary to configure this // conduit. // // Parameters: none // // Returns: 0 - success, !0 - failure // ///////////////////////////////////////////////////////////////////////////// // REVISION HISTORY: // 03/25/98 KRM inital ///////////////////////////////////////////////////////////////////////////// ExportFunc long ConfigureConduit(CSyncPreference& pref) { long nRtn = -1; CfgConduitInfoType cfg; cfg.dwVersion = CFGCONDUITINFO_VERSION_1; cfg.dwSize = sizeof(CfgConduitInfoType); cfg.dwCreatorId = 0; cfg.dwUserId = 0; memset(cfg.szUser , 0, sizeof(cfg.szUser)); memset(cfg.m_PathName, 0, sizeof(cfg.m_PathName)); cfg.syncPermanent = pref.m_SyncType; cfg.syncTemporary = pref.m_SyncType; cfg.syncNew = pref.m_SyncType; cfg.syncPref = eTemporaryPreference; int iResult; iResult = DialogBoxParam((HINSTANCE)hLangInstance, MAKEINTRESOURCE(IDD_CONDUIT_ACTION), GetForegroundWindow(), (DLGPROC)ConfigureDlgProc, (LPARAM)&cfg); if (iResult == 0) { pref.m_SyncType = cfg.syncNew; pref.m_SyncPref = cfg.syncPref; nRtn = 0; } return nRtn; } ///////////////////////////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////////////////// // // Method: GetConduitInfo // // Description: This function provides a way for a Conduit to provide info // to the caller. // In this version of the call, MFC Version, Conduit Name, and // Default sync action are the types of information this call // will return. // // Parameters: ConduitInfoEnum infoType - enum specifying what info is being // requested. // void *pInArgs - This parameter may be null, except for the Conduit // name enum, this value will be a ConduitRequestInfoType structure. // This following to parameters vary depending upon the info being requested. // For enum eConduitName // void *pOut - will be a pointer to a character buffer // DWORD *pdwOutSize - will be a pointer to a DWORD specifying the size of the character buffer. // // For enum eMfcVersion // void *pOut - will be a pointer to a DWORD // DWORD *pdwOutSize - will be a pointer to a DWORD specifying the size of pOut. // // For enum eDefaultAction // void *pOut - will be a pointer to a eSyncType variable // DWORD *pdwOutSize - will be a pointer to a DWORD specifying the size of pOut. // // Returns: 0 - Success. // !0 - error code. // ///////////////////////////////////////////////////////////////////////////// // REVISION HISTORY: // 01/23/98 KRM Created // ///////////////////////////////////////////////////////////////////////////// ExportFunc long GetConduitInfo(ConduitInfoEnum infoType, void *pInArgs, void *pOut, DWORD *pdwOutSize) { if (!pOut) return CONDERR_INVALID_PTR; if (!pdwOutSize) return CONDERR_INVALID_OUTSIZE_PTR; switch (infoType) { case eConduitName: // This code is for example. This conduit does not use this code if (!pInArgs) return CONDERR_INVALID_INARGS_PTR; ConduitRequestInfoType *pInfo; pInfo = (ConduitRequestInfoType *)pInArgs; if ((pInfo->dwVersion != CONDUITREQUESTINFO_VERSION_1) || (pInfo->dwSize != SZ_CONDUITREQUESTINFO)) return CONDERR_INVALID_INARGS_STRUCT; if (!::LoadString((HINSTANCE)hLangInstance, IDS_CONDUIT_NAME, (TCHAR*)pOut, *pdwOutSize)) return CONDERR_CONDUIT_RESOURCE_FAILURE; break; case eDefaultAction: if (*pdwOutSize != sizeof(eSyncTypes)) return CONDERR_INVALID_BUFFER_SIZE; (*(eSyncTypes*)pOut) = eFast; break; case eMfcVersion: if (*pdwOutSize != sizeof(DWORD)) return CONDERR_INVALID_BUFFER_SIZE; (*(DWORD*)pOut) = MFC_NOT_USED; break; default: return CONDERR_UNSUPPORTED_CONDUITINFO_ENUM; } return 0; } ////////////////////////////////////===============================/////////// ///////////////////////////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////////////////// // // Method: CfgConduit // // Description: This is the second instance of ConfigureConduit. This function // is provided with more info from the caller. // This version of the function only supports the eConfig1 enum. // // Parameters: ConduitCfgEnum cfgType - enum specifying the version of the // CfgConduit Call. // void *pArgs - In the eConfig1 call, this is a pointer to aCfgConduitInfoType // structure. This structure provides extra info to the conduit. // DWORD *pdwArgsSize - This is a pointer to a DWORD specifying the size of pArgs. // // Returns: 0 - Success. // !0 - error code. // ///////////////////////////////////////////////////////////////////////////// // REVISION HISTORY: // 01/23/98 KRM Created // ///////////////////////////////////////////////////////////////////////////// ExportFunc long CfgConduit( ConduitCfgEnum cfgType, void *pArgs, DWORD *pdwArgsSize) { long nRtn = -1; TCHAR szName[256]; DWORD dwNamesize; ConduitRequestInfoType infoStruct; CfgConduitInfoType *pCfgInfo; dwNamesize = sizeof(szName); if (!pArgs) return CONDERR_INVALID_INARGS_PTR; if (!pdwArgsSize) return CONDERR_INVALID_ARGSSIZE_PTR; if (*pdwArgsSize != SZ_CFGCONDUITINFO) return CONDERR_INVALID_ARGSSIZE; if (cfgType != eConfig1) return CONDERR_UNSUPPORTED_CFGCONDUIT_ENUM; pCfgInfo = (CfgConduitInfoType *)pArgs; if (pCfgInfo->dwVersion != CFGCONDUITINFO_VERSION_1) return CONDERR_UNSUPPORTED_STRUCT_VERSION; infoStruct.dwVersion = CONDUITREQUESTINFO_VERSION_1; infoStruct.dwSize = SZ_CONDUITREQUESTINFO; infoStruct.dwCreatorId = pCfgInfo->dwCreatorId; infoStruct.dwUserId = pCfgInfo->dwUserId; strcpy(infoStruct.szUser, pCfgInfo->szUser); nRtn = GetConduitInfo(eConduitName, (void *)&infoStruct, (void *)szName, &dwNamesize); if (nRtn) return nRtn; int iResult; iResult = DialogBoxParam((HINSTANCE)hLangInstance, MAKEINTRESOURCE(IDD_CONDUIT_CFG_DETAILED), GetForegroundWindow(), (DLGPROC)ConfigureDlgProc, (LPARAM)pCfgInfo); return 0; } long CALLBACK ConfigureDlgProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) { static CfgConduitInfoType *pCfgInfo; TCHAR szPath[256]; int size = 256; switch (Message) { case WM_INITDIALOG: if (lParam != 0) { TCHAR szBuffer[256]; TCHAR szBuf2[256]; LoadString((HINSTANCE)hLangInstance, IDS_SYNC_ACTION_TEXT, szBuffer, sizeof(szBuffer)); SetDlgItemText(hWnd, IDC_ACTIONGROUPBOXTEXT, szBuffer); LoadString((HINSTANCE)hLangInstance, IDS_CONDUIT_NAME, szBuffer, sizeof(szBuffer)); SetWindowText(hWnd, szBuffer); // Load the bitmaps properly LoadCfgDlgBitmaps(hWnd); pCfgInfo = (CfgConduitInfoType *)lParam; if (pCfgInfo->syncTemporary == eHHtoPC || pCfgInfo->syncTemporary == eFast || pCfgInfo->syncTemporary == eSlow) { pCfgInfo->syncTemporary = ePCtoHH; } switch (pCfgInfo->syncTemporary){ case eFast: case eSlow: CheckRadioButton( hWnd, IDC_RADIO_SYNC, IDC_RADIO_DONOTHING, IDC_RADIO_SYNC); LoadString((HINSTANCE)hLangInstance, IDS_SYNC_FILES, szBuffer, sizeof(szBuffer)); break; case ePCtoHH: CheckRadioButton( hWnd, IDC_RADIO_SYNC, IDC_RADIO_DONOTHING, IDC_RADIO_PCTOHH); LoadString((HINSTANCE)hLangInstance, IDS_PCTOHH, szBuffer, sizeof(szBuffer)); break; case eHHtoPC: CheckRadioButton( hWnd, IDC_RADIO_SYNC, IDC_RADIO_DONOTHING, IDC_RADIO_HHTOPC); LoadString((HINSTANCE)hLangInstance, IDS_HHTOPC, szBuffer, sizeof(szBuffer)); break; case eDoNothing: default: CheckRadioButton( hWnd, IDC_RADIO_SYNC, IDC_RADIO_DONOTHING, IDC_RADIO_DONOTHING); LoadString((HINSTANCE)hLangInstance, IDS_DO_NOTHING, szBuffer, sizeof(szBuffer)); break; } // did we get called from the old config call or the new cfg call? if (pCfgInfo->dwCreatorId != 0) { SetDlgItemText(hWnd, IDC_STATIC_TEMPORARY, szBuffer); switch (pCfgInfo->syncPermanent){ case eFast: case eSlow: LoadString((HINSTANCE)hLangInstance, IDS_SYNC_FILES, szBuffer, sizeof(szBuffer)); break; case ePCtoHH: LoadString((HINSTANCE)hLangInstance, IDS_PCTOHH, szBuffer, sizeof(szBuffer)); break; case eHHtoPC: LoadString((HINSTANCE)hLangInstance, IDS_HHTOPC, szBuffer, sizeof(szBuffer)); break; case eDoNothing: default: LoadString((HINSTANCE)hLangInstance, IDS_DO_NOTHING, szBuffer, sizeof(szBuffer)); break; } SetDlgItemText(hWnd, IDC_STATIC_PERMANENT, szBuffer); LoadString((HINSTANCE)hLangInstance, IDS_CURRENT_SETTINGS_GROUP, szBuffer, sizeof(szBuffer)); wsprintf(szBuf2, szBuffer, pCfgInfo->szUser); SetDlgItemText(hWnd, IDC_CURRENT_SETTINGS_GROUP, szBuf2); } } break; case WM_COMMAND: switch (wParam) { case IDC_RADIO_SYNC: case IDC_RADIO_PCTOHH: case IDC_RADIO_HHTOPC: case IDC_RADIO_DONOTHING: CheckRadioButton( hWnd, IDC_RADIO_SYNC, IDC_RADIO_DONOTHING, wParam); break; case IDCANCEL: EndDialog(hWnd, 1); return TRUE; case IDOK: if (IsDlgButtonChecked(hWnd, IDC_RADIO_SYNC)) { pCfgInfo->syncNew = eFast; } else if (IsDlgButtonChecked(hWnd, IDC_RADIO_PCTOHH)) { pCfgInfo->syncNew = ePCtoHH; } else if (IsDlgButtonChecked(hWnd, IDC_RADIO_HHTOPC)) { pCfgInfo->syncNew = eHHtoPC; } else { pCfgInfo->syncNew = eDoNothing; } if (IsDlgButtonChecked(hWnd, IDC_MAKEDEFAULT)){ pCfgInfo->syncPref = ePermanentPreference; } else { pCfgInfo->syncPref = eTemporaryPreference; } EndDialog(hWnd, 0); return TRUE; case IDHELP: #ifdef _DEBUG #define HELP_FILE "hotsyncd.hlp" #else #define HELP_FILE "hotsync.hlp" #endif if (GetModuleFileName((HINSTANCE)hAppInstance, szPath, sizeof(szPath))) { // Look for the end of the path int fileOffset; fileOffset = strlen(szPath); for (; fileOffset > 0; fileOffset--) { if (szPath[fileOffset] == '\\') break; } if (fileOffset > 0) { szPath[fileOffset + 1] = 0; strcat(szPath, HELP_FILE); WinHelp(hWnd, szPath, HELP_CONTEXT, IDD_CONDUIT_ACTION + 0x20000 /*base resource*/); } } return TRUE; break; default: break; } break; case WM_HELP: if (GetModuleFileName((HINSTANCE)hAppInstance, szPath, sizeof(szPath))) { // Look for the end of the path int fileOffset; fileOffset = strlen(szPath); for (; fileOffset > 0; fileOffset--) { if (szPath[fileOffset] == '\\') break; } if (fileOffset > 0) { szPath[fileOffset + 1] = 0; strcat(szPath, HELP_FILE); WinHelp(hWnd, szPath, HELP_CONTEXT, IDD_CONDUIT_ACTION + 0x20000 /*base resource*/); } } return TRUE; case WM_SYSCOLORCHANGE: LoadCfgDlgBitmaps(hWnd); break; default: break; } return FALSE; } ///////////////////////////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////////////////// // // Method: LoadCfgDlgBitmaps // // Description: This routines translates the bitmap gray background to the // button face color set in the control panel/window appearances // // Parameters: HWND - hDlg, handle of the dialog // // Returns: none // ///////////////////////////////////////////////////////////////////////////// // REVISION HISTORY: // 01/15/99 Carl Created // ///////////////////////////////////////////////////////////////////////////// void LoadCfgDlgBitmaps(HWND hDlg) { COLORMAP colorMap; HWND hwndButton; HBITMAP hBitmap, hOldBitmap; // // setup the bitmaps // colorMap.to = GetSysColor(COLOR_BTNFACE); colorMap.from = RGB(192,192,192); // Sync hBitmap = CreateMappedBitmap((HINSTANCE)hLangInstance, IDB_SYNC, 0, &colorMap, 1); // associate the bitmap with the button. if ((hwndButton = GetDlgItem(hDlg, IDC_SYNC)) != NULL) { hOldBitmap = (HBITMAP)SendMessage(hwndButton, STM_SETIMAGE,(WPARAM)IMAGE_BITMAP, (LPARAM)(HANDLE)hBitmap); if (hOldBitmap != NULL) DeleteObject((HGDIOBJ)hOldBitmap); } // PC to HH hBitmap = CreateMappedBitmap((HINSTANCE)hLangInstance, IDB_PCTOHH, 0, &colorMap, 1); // associate the bitmap with the button. if ((hwndButton = GetDlgItem(hDlg, IDC_PCTOHH)) != NULL) { hOldBitmap = (HBITMAP)SendMessage(hwndButton, STM_SETIMAGE,(WPARAM)IMAGE_BITMAP, (LPARAM)(HANDLE)hBitmap); if (hOldBitmap != NULL) DeleteObject((HGDIOBJ)hOldBitmap); } // HH to PC hBitmap = CreateMappedBitmap((HINSTANCE)hLangInstance, IDB_HHTOPC, 0, &colorMap, 1); // associate the bitmap with the button. if ((hwndButton = GetDlgItem(hDlg, IDC_HHTOPC)) != NULL) { hOldBitmap = (HBITMAP)SendMessage(hwndButton, STM_SETIMAGE,(WPARAM)IMAGE_BITMAP, (LPARAM)(HANDLE)hBitmap); if (hOldBitmap != NULL) DeleteObject((HGDIOBJ)hOldBitmap); } // Do Nothing hBitmap = CreateMappedBitmap((HINSTANCE)hLangInstance, IDB_DONOTHING, 0, &colorMap, 1); // associate the bitmap with the button. if ((hwndButton = GetDlgItem(hDlg, IDC_DONOTHING)) != NULL) { hOldBitmap = (HBITMAP)SendMessage(hwndButton, STM_SETIMAGE,(WPARAM)IMAGE_BITMAP, (LPARAM)(HANDLE)hBitmap); if (hOldBitmap != NULL) DeleteObject((HGDIOBJ)hOldBitmap); } } plucker-1.8/tools/plucker-conduit/msw/CHANGELOG.txt0100644000076400001440000000037607621473073021170 0ustar mickeusers0.1.2 February 3, 2003 Changed wait from multi object to single object 0.1.1 January 31, 2003 Changed Hotsync log messages to indicate success or failure Added command line run to Hotsync log ouput 0.1.0 January 31, 2003 Initial releaseplucker-1.8/tools/pluck-comics/0040755000076400001440000000000010052675410015577 5ustar mickeusersplucker-1.8/tools/pluck-comics/Makefile.in0100644000076400001440000000251707713213406017651 0ustar mickeusers# # $id$ # SHELL = @SHELL@ top_builddir = ../.. subdir = tools/pluck-comics srcdir = @srcdir@ VPATH = @srcdir@ VERSION = @VERSION@ DESTDIR = BINDIR = $(DESTDIR)@bindir@ COMICSLIST_DIR = $(DESTDIR)@PLUCKERDIR@/comics MODULE_DIR = $(DESTDIR)@MODULE_DIR@ PYTHONDIR = @PYTHON_LIBDIR@ PYTHON = @PYTHON@ MKINSTALLDIRS = $(top_builddir)/mkinstalldirs all: @echo "all done" Makefile: Makefile.in $(top_builddir)/config.status cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status install: $(MKINSTALLDIRS) $(MODULE_DIR) $(MKINSTALLDIRS) $(COMICSLIST_DIR) cp pluck-comics.py $(MODULE_DIR) chmod 755 $(MODULE_DIR)/pluck-comics.py cp *.list $(COMICSLIST_DIR) $(PYTHON) $(PYTHONDIR)/compileall.py $(MODULE_DIR) $(PYTHON) -O $(PYTHONDIR)/compileall.py $(MODULE_DIR) clean: find . -name '*~' -exec rm -f {} \; find . -name '*.pyc' -exec rm -f {} \; find . -name '*.pyo' -exec rm -f {} \; distclean: clean rm -f Makefile pluck-comics.py maintainer-clean: distclean @echo "------------------------------------------------------------" @echo "This command is intended for maintainers to use..." @echo "it deletes files that may require special tools to rebuild." @echo "------------------------------------------------------------" plucker-1.8/tools/pluck-comics/ucomics.com.list0100644000076400001440000005230510024364122020707 0ustar mickeusers# # $Id: ucomics.com.list,v 1.4 2004/03/12 16:41:54 chrish Exp $ # urls updated on 2004/03/12 by Ducem Barr # # Comics from www.ucomics.com # comic_list.append({ 'name': 'adamathome', 'page': 'http://www.ucomics.com/adamathome/index.phtml', 'expr': "images.ucomics.com/comics/ad/\d+/ad\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Adam@Home'}) comic_list.append({ 'name': 'animalcrackers', 'page': 'http://www.ucomics.com/animalcrackers/index.phtml', 'expr': "images.ucomics.com/comics/tmani/\d+/tmani\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Animal Crackers'}) comic_list.append({ 'name': 'laloalcaraz', 'page': 'http://www.ucomics.com/laloalcaraz/index.phtml', 'expr': "images.ucomics.com/comics/la/\d+/la\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Lalo Alcaraz'}) comic_list.append({ 'name': 'annie', 'page': 'http://www.ucomics.com/annie/index.phtml', 'expr': "images.ucomics.com/comics/tmann/\d+/tmann\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Annie'}) comic_list.append({ 'name': 'baldo', 'page': 'http://www.ucomics.com/baldo/index.phtml', 'expr': "images.ucomics.com/comics/ba/\d+/ba\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Baldo'}) comic_list.append({ 'name': 'baldoespanol', 'page': 'http://www.ucomics.com/baldoespanol/index.phtml', 'expr': "images.ucomics.com/comics/be/\d+/be\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Baldo en Espanol'}) comic_list.append({ 'name': 'thebigpicture', 'page': 'http://www.ucomics.com/thebigpicture/index.phtml', 'expr': "images.ucomics.com/comics/bi/\d+/bi\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'The Big Picture'}) comic_list.append({ 'name': 'bigtop', 'page': 'http://www.ucomics.com/bigtop/index.phtml', 'expr': "images.ucomics.com/comics/bt/\d+/bt\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Big Top'}) comic_list.append({ 'name': 'bizarro', 'page': 'http://www.ucomics.com/bizarro/index.phtml', 'expr': "images.ucomics.com/comics/bz/\d+/bz\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Bizarro'}) comic_list.append({ 'name': 'boondocks', 'page': 'http://www.ucomics.com/boondocks/index.phtml', 'expr': "images.ucomics.com/comics/bo/\d+/bo\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'The Boondocks'}) comic_list.append({ 'name': 'bornlucky', 'page': 'http://www.ucomics.com/bornlucky/index.phtml', 'expr': "images.ucomics.com/comics/bol/\d+/bol\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Born Lucky'}) comic_list.append({ 'name': 'bottomliners', 'page': 'http://www.ucomics.com/bottomliners/index.phtml', 'expr': "images.ucomics.com/comics/tmbot/\d+/tmbot\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Bottom Liners'}) comic_list.append({ 'name': 'boundandgagged', 'page': 'http://www.ucomics.com/boundandgagged/index.phtml', 'expr': "images.ucomics.com/comics/tmbou/\d+/tmbou\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Bound and Gagged'}) comic_list.append({ 'name': 'brendastarr', 'page': 'http://www.ucomics.com/brendastarr/index.phtml', 'expr': "images.ucomics.com/comics/tmbre/\d+/tmbre\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Brenda Starr'}) comic_list.append({ 'name': 'broomhilda', 'page': 'http://www.ucomics.com/broomhilda/index.phtml', 'expr': "images.ucomics.com/comics/tmbro/\d+/tmbro\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Broom Hilda'}) comic_list.append({ 'name': 'calvinandhobbes', 'page': 'http://www.ucomics.com/calvinandhobbes/index.phtml', 'expr': "images.ucomics.com/comics/ch/\d+/ch\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Calvin and Hobbes'}) comic_list.append({ 'name': 'captainribman', 'page': 'http://www.ucomics.com/captainribman/index.phtml', 'expr': "images.ucomics.com/comics/tmcap/\d+/tmcap\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Captain RibMan'}) comic_list.append({ 'name': 'cathy', 'page': 'http://www.ucomics.com/cathy/index.phtml', 'expr': "images.ucomics.com/comics/ca/\d+/ca\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Cathy'}) comic_list.append({ 'name': 'catswithhands', 'page': 'http://www.ucomics.com/catswithhands/index.phtml', 'expr': "images.ucomics.com/comics/tmcat/\d+/tmcat\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Cats With Hands'}) comic_list.append({ 'name': 'cleats', 'page': 'http://www.ucomics.com/cleats/index.phtml', 'expr': "images.ucomics.com/comics/cle/\d+/cle\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Cleats'}) comic_list.append({ 'name': 'citizendog', 'page': 'http://www.ucomics.com/citizendog/index.phtml', 'expr': "images.ucomics.com/comics/cd/\d+/cd\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Citizen Dog'}) comic_list.append({ 'name': 'closetohome', 'page': 'http://www.ucomics.com/closetohome/index.phtml', 'expr': "images.ucomics.com/comics/cl/\d+/cl\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Close to Home'}) comic_list.append({ 'name': 'compu-toon', 'page': 'http://www.ucomics.com/compu-toon/index.phtml', 'expr': "images.ucomics.com/comics/tmcom/\d+/tmcom\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Compu-toon'}) comic_list.append({ 'name': 'paulconrad', 'page': 'http://www.ucomics.com/paulconrad/index.phtml', 'expr': "images.ucomics.com/comics/tmpco/\d+/tmpco\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Paul Conrad'}) comic_list.append({ 'name': 'cornered', 'page': 'http://www.ucomics.com/cornered/index.phtml', 'expr': "images.ucomics.com/comics/co/\d+/co\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Cornered'}) comic_list.append({ 'name': 'crankshaft', 'page': 'http://www.ucomics.com/crankshaft/index.phtml', 'expr': "images.ucomics.com/comics/cs/\d+/cs\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Crankshaft'}) comic_list.append({ 'name': 'jeffdanziger', 'page': 'http://www.ucomics.com/jeffdanziger/index.phtml', 'expr': "images.ucomics.com/comics/jd/\d+/jd\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Jeff Danziger'}) comic_list.append({ 'name': 'mattdavies', 'page': 'http://www.ucomics.com/mattdavies/index.phtml', 'expr': "images.ucomics.com/comics/tmmda/\d+/tmmda\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Matt Davies'}) comic_list.append({ 'name': 'dicktracy', 'page': 'http://www.ucomics.com/dicktracy/index.phtml', 'expr': "images.ucomics.com/comics/tmdic/\d+/tmdic\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Dick Tracy'}) comic_list.append({ 'name': 'doodles', 'page': 'http://www.ucomics.com/doodles/index.phtml', 'expr': "images.ucomics.com/comics/tmdoo/\d+/tmdoo\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Doodles'}) comic_list.append({ 'name': 'doonesbury', 'page': 'http://www.ucomics.com/doonesbury/index.phtml', 'expr': "images.ucomics.com/comics/db/\d+/db\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Doonesbury'}) comic_list.append({ 'name': 'dunaginspeople', 'page': 'http://www.ucomics.com/dunaginspeople/index.phtml', 'expr': "images.ucomics.com/comics/tmdun/\d+/tmdun\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Dunagins People'}) comic_list.append({ 'name': 'duplex', 'page': 'http://www.ucomics.com/duplex/index.phtml', 'expr': "images.ucomics.com/comics/dp/\d+/dp\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'The Duplex'}) comic_list.append({ 'name': 'thefifthwave', 'page': 'http://www.ucomics.com/thefifthwave/index.phtml', 'expr': "images.ucomics.com/comics/fw/\d+/fw\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'The 5th Wave'}) comic_list.append({ 'name': 'foxtrot', 'page': 'http://www.ucomics.com/foxtrot/index.phtml', 'expr': "images.ucomics.com/comics/ft/\d+/ft\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'FoxTrot'}) comic_list.append({ 'name': 'fredbasset', 'page': 'http://www.ucomics.com/fredbasset/index.phtml', 'expr': "images.ucomics.com/comics/tmfba/\d+/tmfba\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Fred Basset'}) comic_list.append({ 'name': 'thefuscobrothers', 'page': 'http://www.ucomics.com/thefuscobrothers/index.phtml', 'expr': "images.ucomics.com/comics/fu/\d+/fu\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'The Fusco Brothers'}) comic_list.append({ 'name': 'garfield', 'page': 'http://www.ucomics.com/garfield/index.phtml', 'expr': "images.ucomics.com/comics/ga/\d+/ga\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Garfield'}) comic_list.append({ 'name': 'gasolinealley', 'page': 'http://www.ucomics.com/gasolinealley/index.phtml', 'expr': "images.ucomics.com/comics/tmgas/\d+/tmgas\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Gasoline Alley'}) comic_list.append({ 'name': 'gilthorp', 'page': 'http://www.ucomics.com/gilthorp/index.phtml', 'expr': "images.ucomics.com/comics/tmgil/\d+/tmgil\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Gil Thorp'}) comic_list.append({ 'name': 'walthandelsman', 'page': 'http://www.ucomics.com/walthandelsman/index.phtml', 'expr': "images.ucomics.com/comics/tmwha/\d+/tmwha\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Walt Handelsman'}) comic_list.append({ 'name': 'heartofthecity', 'page': 'http://www.ucomics.com/heartofthecity/index.phtml', 'expr': "images.ucomics.com/comics/hc/\d+/hc\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Heart of the City'}) comic_list.append({ 'name': 'helen', 'page': 'http://www.ucomics.com/helen/index.phtml', 'expr': "images.ucomics.com/comics/tmhel/\d+/tmhel\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Helen, Sweetheart of the Internet'}) comic_list.append({ 'name': 'davidhorsey', 'page': 'http://www.ucomics.com/davidhorsey/index.phtml', 'expr': "images.ucomics.com/comics/tmdho/\d+/tmdho\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'David Horsey'}) comic_list.append({ 'name': 'inthebleachers', 'page': 'http://www.ucomics.com/inthebleachers/index.phtml', 'expr': "images.ucomics.com/comics/bl/\d+/bl\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'In the Bleachers'}) comic_list.append({ 'name': 'james', 'page': 'http://www.ucomics.com/james/index.phtml', 'expr': "images.ucomics.com/comics/jm/\d+/jm\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'James'}) comic_list.append({ 'name': 'kudzu', 'page': 'http://www.ucomics.com/kudzu/index.phtml', 'expr': "images.ucomics.com/comics/tmkud/\d+/tmkud\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Kudzu'}) comic_list.append({ 'name': 'dicklocher', 'page': 'http://www.ucomics.com/dickocher/index.phtml', 'expr': "images.ucomics.com/comics/tmdlo/\d+/tmdlo\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Dick Locher'}) comic_list.append({ 'name': 'lola', 'page': 'http://www.ucomics.com/lola/index.phtml', 'expr': "images.ucomics.com/comics/tmlol/\d+/tmlol\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Lola'}) comic_list.append({ 'name': 'looseparts', 'page': 'http://www.ucomics.com/looseparts/index.phtml', 'expr': "images.ucomics.com/comics/tmloo/\d+/tmloo\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Loose Parts'}) comic_list.append({ 'name': 'chanlowe', 'page': 'http://www.ucomics.com/chanlowe/index.phtml', 'expr': "images.ucomics.com/comics/tmclo/\d+/tmclo\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Chan Lowe'}) comic_list.append({ 'name': 'dougmarlette', 'page': 'http://www.ucomics.com/dougmarlette/index.phtml', 'expr': "images.ucomics.com/comics/tmdma/\d+/tmdma\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Doug Marlette'}) comic_list.append({ 'name': 'meehanstreak', 'page': 'http://www.ucomics.com/meehanstreak/index.phtml', 'expr': "images.ucomics.com/comics/tmmee/\d+/tmmee\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Meehan Streak'}) comic_list.append({ 'name': 'themiddletons', 'page': 'http://www.ucomics.com/themiddletons/index.phtml', 'expr': "images.ucomics.com/comics/tmmid/\d+/tmmid\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'The Middletons'}) comic_list.append({ 'name': 'misterboffo', 'page': 'http://www.ucomics.com/misterboffo/index.phtml', 'expr': "images.ucomics.com/comics/mb/\d+/mb\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Mister Boffo'}) comic_list.append({ 'name': 'mixedmedia', 'page': 'http://www.ucomics.com/mixedmedia/index.phtml', 'expr': "images.ucomics.com/comics/tmmix/\d+/tmmix\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Mixed Media'}) comic_list.append({ 'name': 'monkeyhouse', 'page': 'http://www.ucomics.com/monkeyhouse/index.phtml', 'expr': "images.ucomics.com/comics/tmmon/\d+/tmmon\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Monkeyhouse'}) comic_list.append({ 'name': 'mrpotatohead', 'page': 'http://www.ucomics.com/mrpotatohead/index.phtml', 'expr': "images.ucomics.com/comics/mrp/\d+/mrp\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Mr. Potato Head'}) comic_list.append({ 'name': 'psmueller', 'page': 'http://www.ucomics.com/psmueller/index.phtml', 'expr': "images.ucomics.com/comics/psm/\d+/psm\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'P.S. Mueller'}) comic_list.append({ 'name': '9to5', 'page': 'http://www.ucomics.com/9to5/index.phtml', 'expr': "images.ucomics.com/comics/tmntf/\d+/tmntf\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': '9 to 5'}) comic_list.append({ 'name': 'nonsequitur', 'page': 'http://www.ucomics.com/nonsequitur/index.phtml', 'expr': "images.ucomics.com/comics/nq/\d+/nq\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Non Sequitur'}) comic_list.append({ 'name': 'jackohman', 'page': 'http://www.ucomics.com/jackohman/index.phtml', 'expr': "images.ucomics.com/comics/tmjoh/\d+/tmjoh\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Jack Ohman'}) comic_list.append({ 'name': 'overboard', 'page': 'http://www.ucomics.com/overboard/index.phtml', 'expr': "images.ucomics.com/comics/ob/\d+/ob\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Overboard'}) comic_list.append({ 'name': 'oddlyenough', 'page': 'http://www.ucomics.com/oddlyenough/index.phtml', 'expr': "images.ucomics.com/comics/oe/\d+/oe\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Oddly Enough'}) comic_list.append({ 'name': 'mikepeters', 'page': 'http://www.ucomics.com/mikepeters/index.phtml', 'expr': "images.ucomics.com/comics/tmmpe/\d+/tmmpe\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Mike Peters'}) comic_list.append({ 'name': 'pluggers', 'page': 'http://www.ucomics.com/pluggers/index.phtml', 'expr': "images.ucomics.com/comics/tmplu/\d+/tmplu\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Pluggers'}) comic_list.append({ 'name': 'preteena', 'page': 'http://www.ucomics.com/preteena/index.phtml', 'expr': "images.ucomics.com/comics/pr/\d+/pr\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Preteena'}) comic_list.append({ 'name': 'thequigmans', 'page': 'http://www.ucomics.com/thequigmans/index.phtml', 'expr': "images.ucomics.com/comics/tmqui/\d+/tmqui\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'The Quigmans'}) comic_list.append({ 'name': 'reallifeadventures', 'page': 'http://www.ucomics.com/reallifeadventures/index.phtml', 'expr': "images.ucomics.com/comics/rl/\d+/rl\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Real Life Adventures'}) comic_list.append({ 'name': 'reynoldsunwrapped', 'page': 'http://www.ucomics.com/reynoldsunwrapped/index.phtml', 'expr': "images.ucomics.com/comics/rw/\d+/rw\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Reynolds Unwrapped'}) comic_list.append({ 'name': 'stevesack', 'page': 'http://www.ucomics.com/stevesack/index.phtml', 'expr': "images.ucomics.com/comics/tmssa/\d+/tmssa\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Steve Sack'}) comic_list.append({ 'name': 'drewsheneman', 'page': 'http://www.ucomics.com/drewsheneman/index.phtml', 'expr': "images.ucomics.com/comics/tmdsh/\d+/tmdsh\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Drew Sheneman'}) comic_list.append({ 'name': 'shoe', 'page': 'http://www.ucomics.com/shoe/index.phtml', 'expr': "images.ucomics.com/comics/tmsho/\d+/tmsho\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Shoe'}) comic_list.append({ 'name': 'waynestayskal', 'page': 'http://www.ucomics.com/waynestayskal/index.phtml', 'expr': "images.ucomics.com/comics/tmwst/\d+/tmwst\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Wayne Stayskal'}) comic_list.append({ 'name': 'stonesoup', 'page': 'http://www.ucomics.com/stonesoup/index.phtml', 'expr': "images.ucomics.com/comics/ss/\d+/ss\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Stone Soup'}) comic_list.append({ 'name': 'danasummers', 'page': 'http://www.ucomics.com/danasummers/index.phtml', 'expr': "images.ucomics.com/comics/tmdsu/\d+/tmdsu\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Dana Summers'}) comic_list.append({ 'name': 'sylvia', 'page': 'http://www.ucomics.com/sylvia/index.phtml', 'expr': "images.ucomics.com/comics/tmsyl/\d+/tmsyl\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Sylvia'}) comic_list.append({ 'name': 'tankmcnamara', 'page': 'http://www.ucomics.com/tankmcnamara/index.phtml', 'expr': "images.ucomics.com/comics/tm/\d+/tm\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Tank McNamara'}) comic_list.append({ 'name': 'anntelnaes', 'page': 'http://www.ucomics.com/anntelnaes/index.phtml', 'expr': "images.ucomics.com/comics/tmate/\d+/tmate\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Ann Telnaes'}) comic_list.append({ 'name': 'tomthedancingbug', 'page': 'http://www.ucomics.com/tomthedancingbug/index.phtml', 'expr': "images.ucomics.com/comics/td/\d+/td\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Tom the Dancing Bug'}) comic_list.append({ 'name': 'danwasserman', 'page': 'http://www.ucomics.com/danwasserman/index.phtml', 'expr': "images.ucomics.com/comics/tmdwa/\d+/tmdwa\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Dan Wasserman'}) comic_list.append({ 'name': 'willynethel', 'page': 'http://www.ucomics.com/willynethel/index.phtml', 'expr': "images.ucomics.com/comics/wes/\d+/wes\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Willy \'N Ethel'}) comic_list.append({ 'name': 'dickwright', 'page': 'http://www.ucomics.com/dickwright/index.phtml', 'expr': "images.ucomics.com/comics/tmdiw/\d+/tmdiw\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Dick Wright'}) comic_list.append({ 'name': 'donwright', 'page': 'http://www.ucomics.com/donwright/index.phtml', 'expr': "images.ucomics.com/comics/tmdow/\d+/tmdow\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Don Wright'}) comic_list.append({ 'name': 'ziggy', 'page': 'http://www.ucomics.com/ziggy/index.phtml', 'expr': "images.ucomics.com/comics/zi/\d+/zi\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Ziggy'}) comic_list.append({ 'name': 'tonyauth', 'page': 'http://www.ucomics.com/tonyauth/index.phtml', 'expr': "images.ucomics.com/comics/ta/\d+/ta\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Tony Auth'}) comic_list.append({ 'name': 'barbarabrandon', 'page': 'http://www.ucomics.com/barbarabrandon/index.phtml', 'expr': "images.ucomics.com/comics/bb/\d+/bb\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Where I\'m Coming From'}) comic_list.append({ 'name': 'stuartcarlson', 'page': 'http://www.ucomics.com/stuartcarlson/index.phtml', 'expr': "images.ucomics.com/comics/sc/\d+/sc\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Stuart Carlson'}) comic_list.append({ 'name': 'billdeore', 'page': 'http://www.ucomics.com/billdeore/index.phtml', 'expr': "images.ucomics.com/comics/bd/\d+/bd\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Bill DeOre'}) comic_list.append({ 'name': 'facesinthenews', 'page': 'http://www.ucomics.com/facesinthenews/index.phtml', 'expr': "images.ucomics.com/comics/kw/\d+/kw\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Faces in the News'}) comic_list.append({ 'name': 'glennmccoy', 'page': 'http://www.ucomics.com/glennmccoy/index.phtml', 'expr': "images.ucomics.com/comics/gm/\d+/gm\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Glenn McCoy'}) comic_list.append({ 'name': 'patoliphant', 'page': 'http://www.ucomics.com/patoliphant/index.phtml', 'expr': "images.ucomics.com/comics/oa/\d+/oa\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Pat Oliphant'}) comic_list.append({ 'name': 'joelpett', 'page': 'http://www.ucomics.com/joelpett/index.phtml', 'expr': "images.ucomics.com/comics/jp/\d+/jp\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Joel Pett'}) comic_list.append({ 'name': 'tedrall', 'page': 'http://www.ucomics.com/tedrall/index.phtml', 'expr': "images.ucomics.com/comics/tr/\d+/tr\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Ted Rall'}) comic_list.append({ 'name': 'bensargent', 'page': 'http://www.ucomics.com/bensargent/index.phtml', 'expr': "images.ucomics.com/comics/bs/\d+/bs\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Ben Sargent'}) comic_list.append({ 'name': 'tomtoles', 'page': 'http://www.ucomics.com/tomtoles/index.phtml', 'expr': "images.ucomics.com/comics/tt/\d+/tt\d+\.gif", 'suff': '.gif', 'base': 'http://', 'title': 'Tom Toles'}) plucker-1.8/tools/pluck-comics/comics.com.list0100644000076400001440000005713207564443253020547 0ustar mickeusers# # $Id: comics.com.list,v 1.4 2002/11/13 12:33:47 nordstrom Exp $ # # Comics from www.comics.com # comic_list.append({ 'name': 'agnes', 'page': 'http://comics.com/creators/agnes/index.html', 'expr': "agnes\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/creators/agnes/archive/images/', 'title': 'Agnes'}) comic_list.append({ 'name': 'alleyoop', 'page': 'http://comics.com/comics/alleyoop/index.html', 'expr': "alleyoop\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/alleyoop/archive/images/', 'title': 'Alley Oop'}) comic_list.append({ 'name': 'andycapp', 'page': 'http://comics.com/creators/andycapp/index.html', 'expr': "andycapp\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/creators/andycapp/archive/images/', 'title': 'Andy Capp'}) comic_list.append({ 'name': 'arlonjanis', 'page': 'http://comics.com/comics/arlonjanis/index.html', 'expr': "arlonjanis\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/arlonjanis/archive/images/', 'title': 'Arlo and Janis'}) comic_list.append({ 'name': 'bc', 'page': 'http://comics.com/creators/bc/index.html', 'expr': "bc\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/creators/bc/archive/images/', 'title': 'B.C.'}) comic_list.append({ 'name': 'ballardst', 'page': 'http://comics.com/creators/ballardst/index.html', 'expr': "ballardst\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/creators/ballardst/archive/images/', 'title': 'Ballard Street'}) comic_list.append({ 'name': 'ben', 'page': 'http://comics.com/comics/ben/index.html', 'expr': "ben\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/ben/archive/images/', 'title': 'Ben'}) comic_list.append({ 'name': 'betty', 'page': 'http://comics.com/comics/betty/index.html', 'expr': "betty\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/betty/archive/images/', 'title': 'Betty'}) comic_list.append({ 'name': 'bignate', 'page': 'http://comics.com/comics/bignate/index.html', 'expr': "bignate\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/bignate/archive/images/', 'title': 'Big Nate'}) comic_list.append({ 'name': 'bornloser', 'page': 'http://comics.com/comics/bornloser/index.html', 'expr': "bornloser\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/bornloser/archive/images/', 'title': 'The Born Loser'}) comic_list.append({ 'name': 'buckets', 'page': 'http://comics.com/comics/buckets/index.html', 'expr': "buckets\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/buckets/archive/images/', 'title': 'The Buckets'}) comic_list.append({ 'name': 'bullsnbears', 'page': 'http://comics.com/comics/bullsnbears/index.html', 'expr': "bullsnbears\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/bullsnbears/archive/images/', 'title': 'Bulls$ \'N\' Bear$'}) comic_list.append({ 'name': 'charlie', 'page': 'http://comics.com/creators/charlie/index.html', 'expr': "charlie\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/creators/charlie/archive/images/', 'title': 'Charlie'}) comic_list.append({ 'name': 'cheapthrills', 'page': 'http://comics.com/wash/cheapthrills/index.html', 'expr': "cheapthrills\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/wash/cheapthrills/archive/images/', 'title': 'Cheap Thrills'}) comic_list.append({ 'name': 'committed', 'page': 'http://comics.com/comics/committed/index.html', 'expr': "committed\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/committed/archive/images/', 'title': 'Committed'}) comic_list.append({ 'name': 'dilbert', 'page': 'http://comics.com/comics/dilbert/', 'expr': "dilbert\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/dilbert/archive/images/', 'title': 'Dilbert'}) comic_list.append({ 'name': 'drabble', 'page': 'http://comics.com/comics/drabble/index.html', 'expr': "drabble\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/drabble/archive/images/', 'title': 'Drabble'}) comic_list.append({ 'name': 'drawingacrowd', 'page': 'http://comics.com/creators/drawingacrowd/index.html', 'expr': "drawingacrowd\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/creators/drawingacrowd/archive/images/', 'title': 'Drawing a Crowd'}) comic_list.append({ 'name': 'fatcats', 'page': 'http://comics.com/comics/fatcats/index.html', 'expr': "fatcats\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/fatcats/archive/images/', 'title': 'Fat Cats'}) comic_list.append({ 'name': 'ferdnand', 'page': 'http://comics.com/comics/ferdnand/index.html', 'expr': "ferdnand\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/ferdnand/archive/images/', 'title': 'Ferd\'nand'}) comic_list.append({ 'name': 'flightdeck', 'page': 'http://comics.com/creators/flightdeck/index.html', 'expr': "flightdeck\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/creators/flightdeck/archive/images/', 'title': 'Flight Deck'}) comic_list.append({ 'name': 'floandfriends', 'page': 'http://comics.com/creators/floandfriends/index.html', 'expr': "floandfriends\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/creators/floandfriends/archive/images/', 'title': 'Flo & Friends'}) comic_list.append({ 'name': 'forbetter', 'page': 'http://comics.com/comics/forbetter/index.html', 'expr': "forbetter\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/forbetter/archive/images/', 'title': 'For Better or For Worse'}) comic_list.append({ 'name': 'forheavens', 'page': 'http://comics.com/creators/forheavens/index.html', 'expr': "forheavens\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/creators/forheavens/archive/images/', 'title': 'For Heaven\'s Sake'}) comic_list.append({ 'name': 'franknernest', 'page': 'http://comics.com/comics/franknernest/index.html', 'expr': "franknernest\d+\.jpg", 'suff': '.jpg', 'base': 'http://comics.com/comics/franknernest/archive/images/', 'title': 'Frank & Ernest'}) comic_list.append({ 'name': 'frazz', 'page': 'http://comics.com/comics/frazz/index.html', 'expr': "frazz\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/frazz/archive/images/', 'title': 'Frazz'}) comic_list.append({ 'name': 'geech', 'page': 'http://comics.com/comics/geech/index.html', 'expr': "geech\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/geech/archive/images/', 'title': 'Geech'}) comic_list.append({ 'name': 'getfuzzy', 'page': 'http://comics.com/comics/getfuzzy/index.html', 'expr': "getfuzzy\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/getfuzzy/archive/images/', 'title': 'Get Fuzzy'}) comic_list.append({ 'name': 'gingermeggs', 'page': 'http://comics.com/comics/gingermeggs/index.html', 'expr': "gingermeggs\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/gingermeggs/archive/images/', 'title': 'Ginger Meggs'}) comic_list.append({ 'name': 'gofigure', 'page': 'http://comics.com/comics/ggofigure/index.html', 'expr': "gofigure\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/gofigure/archive/images/', 'title': 'Go Figure'}) comic_list.append({ 'name': 'graffiti', 'page': 'http://comics.com/comics/graffiti/index.html', 'expr': "graffiti\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/graffiti/archive/images/', 'title': 'Graffiti'}) comic_list.append({ 'name': 'grandave', 'page': 'http://comics.com/comics/grandave/index.html', 'expr': "grandave\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/grandave/archive/images/', 'title': 'Grand Avenue'}) comic_list.append({ 'name': 'grizzwells', 'page': 'http://comics.com/comics/grizzwells/index.html', 'expr': "grizzwells\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/grizzwells/archive/images/', 'title': 'The Grizzwells'}) comic_list.append({ 'name': 'heathcliff', 'page': 'http://comics.com/creators/heathcliff/index.html', 'expr': "heathcliff\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/creators/heathcliff/archive/images/', 'title': 'Heathcliff'}) comic_list.append({ 'name': 'herbnjamaal', 'page': 'http://comics.com/creators/herbnjamaal/index.html', 'expr': "herbnjamaal\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/creators/herbnjamaal/archive/images/', 'title': 'Herb and Jamaal'}) comic_list.append({ 'name': 'herman', 'page': 'http://comics.com/comics/herman/index.html', 'expr': "herman\d+\.jpg", 'suff': '.jpg', 'base': 'http://comics.com/comics/herman/archive/images/', 'title': 'Herman'}) comic_list.append({ 'name': 'janesworld', 'page': 'http://comics.com/comics/janesworld/index.html', 'expr': "janesworld\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/janesworld/archive/images/', 'title': 'Jane\'s World'}) comic_list.append({ 'name': 'jumpstart', 'page': 'http://comics.com/comics/jumpstart/index.html', 'expr': "jumpstart\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/jumpstart/archive/images/', 'title': 'Jump Start'}) comic_list.append({ 'name': 'kitncarlyle', 'page': 'http://comics.com/comics/kitncarlyle/index.html', 'expr': "kitncarlyle\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/kitncarlyle/archive/images/', 'title': 'Kit \'N\' Carlyle'}) comic_list.append({ 'name': 'liberty', 'page': 'http://comics.com/creators/liberty/index.html', 'expr': "liberty\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/creators/liberty/archive/images/', 'title': 'Liberty Meadows'}) comic_list.append({ 'name': 'lilabner', 'page': 'http://comics.com/comics/lilabner/index.html', 'expr': "lilabner\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/lilabner/archive/images/', 'title': 'Li\'l Abner'}) comic_list.append({ 'name': 'luann', 'page': 'http://comics.com/comics/luann/index.html', 'expr': "luann\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/luann/archive/images/', 'title': 'Luann'}) comic_list.append({ 'name': 'lupo', 'page': 'http://comics.com/comics/lupo/index.html', 'expr': "lupo\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/lupo/archive/images/', 'title': 'Lupo Alberto'}) comic_list.append({ 'name': 'marmaduke', 'page': 'http://comics.com/comics/marmaduke/index.html', 'expr': "marmaduke\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/marmaduke/archive/images/', 'title': 'Marmaduke'}) comic_list.append({ 'name': 'meatloaf', 'page': 'http://comics.com/comics/meatloaf/index.html', 'expr': "meatloaf\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/meatloaf/archive/images/', 'title': 'Meatloaf Night'}) comic_list.append({ 'name': 'meg', 'page': 'http://comics.com/comics/meg/index.html', 'expr': "meg\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/meg/archive/images/', 'title': 'Meg!'}) comic_list.append({ 'name': 'momma', 'page': 'http://comics.com/creators/momma/index.html', 'expr': "momma\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/creators/momma/archive/images/', 'title': 'Momma'}) comic_list.append({ 'name': 'motley', 'page': 'http://comics.com/comics/motley/index.html', 'expr': "motley\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/motley/archive/images/', 'title': 'Motley'}) comic_list.append({ 'name': 'nancy', 'page': 'http://comics.com/comics/nancy/index.html', 'expr': "nancy\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/nancy/archive/images/', 'title': 'Nancy'}) comic_list.append({ 'name': 'naturalselection', 'page': 'http://comics.com/creators/naturalselection/index.html', 'expr': "naturalselection\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/creators/naturalselection/archive/images/', 'title': 'Natural Selection'}) comic_list.append({ 'name': 'offthemark', 'page': 'http://comics.com/comics/offthemark/index.html', 'expr': "offthemark\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/offthemark/archive/images/', 'title': 'Off the Mark'}) comic_list.append({ 'name': 'othercoast', 'page': 'http://comics.com/creators/othercoast/index.html', 'expr': "othercoast\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/creators/othercoast/archive/images/', 'title': 'The Other Coast'}) comic_list.append({ 'name': 'genepool', 'page': 'http://comics.com/wash/genepool/index.html', 'expr': "genepool\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/wash/genepool/archive/images/', 'title': 'Out of the Gene Pool'}) comic_list.append({ 'name': 'chickweed', 'page': 'http://comics.com/comics/chickweed/index.html', 'expr': "chickweed\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/chickweed/archive/images/', 'title': '9 Chickweed Lane'}) comic_list.append({ 'name': 'hedge', 'page': 'http://comics.com/comics/hedge/index.html', 'expr': "hedge\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/hedge/archive/images/', 'title': 'Over the Hedge'}) comic_list.append({ 'name': 'onebighappy', 'page': 'http://comics.com/creators/onebighappy/index.html', 'expr': "onebighappy\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/creators/onebighappy/archive/images/', 'title': 'One Big Happy'}) comic_list.append({ 'name': 'pcnpixel', 'page': 'http://comics.com/wash/pcnpixel/index.html', 'expr': "pcnpixel\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/wash/pcnpixel/archive/images/', 'title': 'PC and Pixel'}) comic_list.append({ 'name': 'peanuts', 'page': 'http://comics.com/comics/peanuts', 'expr': "peanuts\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/peanuts/archive/images/', 'title': 'Peanuts'}) comic_list.append({ 'name': 'pearls', 'page': 'http://comics.com/comics/pearls/index.html', 'expr': "pearls\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/pearls/archive/images/', 'title': 'Pearls Before Swine'}) comic_list.append({ 'name': 'pibgorn', 'page': 'http://comics.com/comics/pibgorn/index.html', 'expr': "pibgorn\d+\.jpg", 'suff': '.jpg', 'base': 'http://comics.com/comics/pibgorn/archive/images/', 'title': 'Pibgorn'}) comic_list.append({ 'name': 'pickles', 'page': 'http://comics.com/wash/pickles/index.html', 'expr': "pickles\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/wash/pickles/archive/images/', 'title': 'Pickles'}) comic_list.append({ 'name': 'potluck', 'page': 'http://comics.com/comics/potluck/index.html', 'expr': "potluck\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/potluck/archive/images/', 'title': 'Potluck Parish'}) comic_list.append({ 'name': 'raisingduncan', 'page': 'http://comics.com/comics/raisingduncan/index.html', 'expr': "raisingduncan\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/raisingduncan/archive/images/', 'title': 'Raising Duncan'}) comic_list.append({ 'name': 'reality', 'page': 'http://comics.com/comics/reality/index.html', 'expr': "reality\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/reality/archive/images/', 'title': 'Reality Check'}) comic_list.append({ 'name': 'redandrover', 'page': 'http://comics.com/wash/redandrover/index.html', 'expr': "redandrover\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/wash/redandrover/archive/images/', 'title': 'Red and Rover'}) comic_list.append({ 'name': 'ripleys', 'page': 'http://comics.com/comics/ripleys/index.html', 'expr': "ripleys\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/ripleys/archive/images/', 'title': 'Ripley\'s Believe It or Not!'}) comic_list.append({ 'name': 'monty', 'page': 'http://comics.com/comics/monty/index.html', 'expr': "monty\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/monty/archive/images/', 'title': 'Monty'}) comic_list.append({ 'name': 'roseisrose', 'page': 'http://comics.com/comics/roseisrose/index.html', 'expr': "roseisrose\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/roseisrose/archive/images/', 'title': 'Rose is Rose'}) comic_list.append({ 'name': 'rubes', 'page': 'http://comics.com/creators/rubes/index.html', 'expr': "rubes\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/creators/rubes/archive/images/', 'title': 'Rubes'}) comic_list.append({ 'name': 'rudypark', 'page': 'http://comics.com/comics/rudypark/index.html', 'expr': "rudypark\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/rudypark/archive/images/', 'title': 'Rudy Park'}) comic_list.append({ 'name': 'sheldon', 'page': 'http://comics.com/comics/sheldon/index.html', 'expr': "sheldon\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/sheldon/archive/images/', 'title': 'Sheldon'}) comic_list.append({ 'name': 'shirleynson', 'page': 'http://comics.com/comics/shirleynson/index.html', 'expr': "shirleynson\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/shirleynson/archive/images/', 'title': 'Shirley and Son'}) comic_list.append({ 'name': 'soup2nutz', 'page': 'http://comics.com/comics/soup2nutz/index.html', 'expr': "soup2nutz\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/soup2nutz/archive/images/', 'title': 'Soup to Nutz'}) comic_list.append({ 'name': 'speedbump', 'page': 'http://comics.com/creators/speedbump/index.html', 'expr': "speedbump\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/creators/speedbump/archive/images/', 'title': 'Speed Bump'}) comic_list.append({ 'name': 'stockcartoons', 'page': 'http://comics.com/comics/stockcartoons/index.html', 'expr': "stockcartoons\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/stockcartoons/archive/images/', 'title': 'StockcarToons'}) comic_list.append({ 'name': 'strangebrew', 'page': 'http://comics.com/creators/strangebrew/index.html', 'expr': "strangebrew\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/creators/strangebrew/archive/images/', 'title': 'Strange Brew'}) comic_list.append({ 'name': 'tarzan', 'page': 'http://comics.com/comics/tarzan/index.html', 'expr': "tarzan\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/tarzan/archive/images/', 'title': 'Tarzan'}) comic_list.append({ 'name': 'thatslife', 'page': 'http://comics.com/wash/thatslife/index.html', 'expr': "thatslife\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/wash/thatslife/archive/images/', 'title': 'That\'s Life'}) comic_list.append({ 'name': 'topofworld', 'page': 'http://comics.com/comics/topofworld/index.html', 'expr': "topofworld\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/topofworld/archive/images/', 'title': 'Top of the World!'}) comic_list.append({ 'name': 'trevor', 'page': 'http://comics.com/comics/trevor/index.html', 'expr': "trevor\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/trevor/archive/images/', 'title': 'Trevor'}) comic_list.append({ 'name': 'usplay', 'page': 'http://comics.com/comics/usplay/index.html', 'expr': "usplay\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/usplay/archive/images/', 'title': 'The U.S. of Play'}) comic_list.append({ 'name': 'warped', 'page': 'http://comics.com/comics/warped/index.html', 'expr': "warped\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/warped/archive/images/', 'title': 'Warped'}) comic_list.append({ 'name': 'wizardofid', 'page': 'http://comics.com/creators/wizardofid/index.html', 'expr': "wizardofid\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/creators/wizardofid/archive/images/', 'title': 'Wizard of Id'}) comic_list.append({ 'name': 'workingdaze', 'page': 'http://comics.com/comics/workingdaze/index.html', 'expr': "workingdaze\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/comics/workingdaze/archive/images/', 'title': 'Working Daze'}) comic_list.append({ 'name': 'robertariail', 'page': 'http://comics.com/editoons/ariail/index.html', 'expr': "ariail\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/editoons/ariail/archive/images/', 'title': 'Robert Ariail'}) comic_list.append({ 'name': 'chuckasay', 'page': 'http://comics.com/editoons/asay/index.html', 'expr': "asay\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/editoons/asay/archive/images/', 'title': 'Chuck Asay'}) comic_list.append({ 'name': 'stevebenson', 'page': 'http://comics.com/editoons/benson/index.html', 'expr': "benson\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/editoons/benson/archive/images/', 'title': 'Steve Benson'}) comic_list.append({ 'name': 'jimberry', 'page': 'http://comics.com/editoons/berry/index.html', 'expr': "berry\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/editoons/berry/archive/images/', 'title': 'Jim Berry'}) comic_list.append({ 'name': 'randybish', 'page': 'http://comics.com/editoons/bish/index.html', 'expr': "bish\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/editoons/bish/archive/images/', 'title': 'Randy Bish'}) comic_list.append({ 'name': 'chipbok', 'page': 'http://comics.com/editoons/bok/index.html', 'expr': "bok\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/editoons/bok/archive/images/', 'title': 'Chuck Bok'}) comic_list.append({ 'name': 'billday', 'page': 'http://comics.com/editoons/day/index.html', 'expr': "day\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/editoons/day/archive/images/', 'title': 'Bill Day'}) comic_list.append({ 'name': 'jerryholbert', 'page': 'http://comics.com/editoons/holbert/index.html', 'expr': "holbert\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/editoons/holbert/archive/images/', 'title': 'Jerry Holbert'}) comic_list.append({ 'name': 'ettahulme', 'page': 'http://comics.com/editoons/hulme/index.html', 'expr': "hulme\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/editoons/hulme/archive/images/', 'title': 'Etta Hulme'}) comic_list.append({ 'name': 'drewlitton', 'page': 'http://comics.com/editoons/litton/index.html', 'expr': "litton\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/editoons/litton/archive/images/', 'title': 'Drew Litton'}) comic_list.append({ 'name': 'mikeluckovich', 'page': 'http://comics.com/editoons/luckovich/index.html', 'expr': "luckovich\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/editoons/luckovich/archive/images/', 'title': 'Mike Luckovich'}) comic_list.append({ 'name': 'henrypayne', 'page': 'http://comics.com/editoons/payne/index.html', 'expr': "payne\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/editoons/payne/archive/images/', 'title': 'Henry Payne'}) comic_list.append({ 'name': 'robrogers', 'page': 'http://comics.com/editoons/rogers/index.html', 'expr': "rogers\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/editoons/rogers/archive/images/', 'title': 'Rob Rogers'}) comic_list.append({ 'name': 'billschorr', 'page': 'http://comics.com/editoons/schorr/index.html', 'expr': "schorr\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/editoons/schorr/archive/images/', 'title': 'Bill Schorr'}) comic_list.append({ 'name': 'mikesmith', 'page': 'http://comics.com/editoons/smith/index.html', 'expr': "smith\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/editoons/smith/archive/images/', 'title': 'Mike Smith'}) comic_list.append({ 'name': 'jeffstahler', 'page': 'http://comics.com/editoons/stahler/index.html', 'expr': "stahler\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/editoons/stahler/archive/images/', 'title': 'Jeff Stahler'}) comic_list.append({ 'name': 'edstein', 'page': 'http://comics.com/editoons/stein/index.html', 'expr': "stein\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/editoons/stein/archive/images/', 'title': 'Ed Stein'}) comic_list.append({ 'name': 'paulszep', 'page': 'http://comics.com/editoons/szep/index.html', 'expr': "szep\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/editoons/szep/archive/images/', 'title': 'Paul Szep'}) comic_list.append({ 'name': 'garyvarvel', 'page': 'http://comics.com/editoons/varvel/index.html', 'expr': "varvel\d+\.gif", 'suff': '.gif', 'base': 'http://comics.com/editoons/varvel/archive/images/', 'title': 'Gary Varvel'}) plucker-1.8/tools/pluck-comics/pluck-comics.py.in0100755000076400001440000001167707713213406021166 0ustar mickeusers#!/usr/bin/python2.2 """ pluck-comics.py $Id: pluck-comics.py.in,v 1.5 2003/08/03 14:07:02 nordstrom Exp $ Gathers comics from selected websites for Plucker Copyright (C) 2001, Christopher R. Hawks Distributable under the GNU General Public License Version 2 or newer. """ import sys import os import re import urllib import getopt import time import string import random get_all = 0 make_home = 0 show_icons = 0 remove_all = 0 random_count = 0 spin_img = 0 nocache = 0 show_all = 0 verbose = 0 # Where to put the comics location = '@COMICS_DIR@' # Where libraries are stored libdir = '@COMICSLIST_DIR@' # URL shortening utility def shorten_url(line, length = 30): sline = line while len(sline) > length: parts = string.split(sline, '/') if len(parts) < 5: return sline if parts.count('...'): parts.remove('...') parts[-2:-1] = ['...'] # parts[(len(parts) / 3) * 2] = '...' sline = string.join(parts, '/') return sline # Comic dictionaries example #comic_list.append({ # 'name': 'name of comic for filename and selection', # 'page': 'URL of the comic page', # 'expr': "regex for the picture name", # 'suff': 'suffix of image (.gif, .jpg, .etc)', # 'base': 'URL where the pictures are stored _or_ cgi script (see popeye)', # 'refr': 'URL of referring page (some King Features comics need this', # 'title': 'Proper title of the comic'}) comic_list = [] random_imgs = [] for name in os.listdir(libdir): if name[-5:] == '.list': execfile(os.path.join(libdir,name)) now = time.localtime(time.time()) today = time.strftime("%Y-%m-%d", now) (opts, args) = getopt.getopt(sys.argv[1:], "adhir:s:l:nSv") for (opt, arg) in opts: if opt == "-a": get_all = 1 if opt == "-d": remove_all = 1 if opt == "-h": make_home = 1 if opt == "-i": show_icons = 1 if opt == "-r": random_count = int(arg) if opt == "-s": spin_img = arg if opt == "-l": location = arg if opt == "-n": nocache = 1 if opt == "-S": show_all = 1 if opt == "-v": verbose = 1 if remove_all: for name in os.listdir(location): os.remove(os.path.join(location,name)) if not args and not get_all and not make_home and not random_count: print "Usage: %s [-adhinSv] [-r x] [-s x] [-l location] comic [comic] ..." % sys.argv[0] print "\t-a Collect All known comics" print "\t-d Delete _all_ files in \'location\' (%s) first" % location print "\t-h Create a Home page (%s)" % os.path.join(location, 'index.html') print "\t-i Put Icons on home page" print "\t-l Location to store the comics" print "\t-n Bypass cache" print "\t-r Collect x number of Random comics" print "\t-s Spin the comic x degrees (uses imagemagick)" print "\t-S Show available comics" print "\t-v Verbose mode" if random_count: for x in range(random_count): chosen = random.choice(comic_list) random_imgs.append(chosen['name']) for get_me in comic_list: if get_all or get_me['name'] in args or get_me['name'] in random_imgs: try: if verbose: print "Fetching Page %s" % shorten_url(get_me['page'], 60) path = urllib.URLopener() if nocache: path.addheader('pragma', 'no-cache') conn = path.open(get_me['page']) page = conn.read() conn.close() name = re.search(get_me['expr'], page) if name is not None: if verbose: print "Fetching Comic %s" \ % shorten_url(get_me['base'] + name.group(), 60) if get_me.has_key('refr'): path.addheader('Referer', get_me['refr']) conn = path.open(get_me['base'] + name.group()) if nocache: path.addheader('pragma', 'no-cache') comic = conn.read() conn.close() title = get_me['name'] + today output = open(os.path.join(location,title + get_me['suff']), 'wb') output.write(comic) output.close() if spin_img: filename = os.path.join(location,title + get_me['suff']) command = "convert -rotate %s %s %s" % (rotate_img, filename, filename) if verbose: print "Rotating Image %s degrees" % spin_img os.popen(command) except: if verbose: print "Comic %s failed!" % get_me['name'] pass if make_home: if verbose: print "Creating Home Page %s" % os.path.join(location, 'index.html') home = open(os.path.join(location, 'index.html'), 'w') home.write("Cartoons\n") home.write("

Comics from the Web.

\n") home.write("

") for name in os.listdir(location): if name != 'index.html': comic_date = name[-14:-4] comic_name = name[0:-14] for get_me in comic_list: if get_me['name'] == comic_name: comic_title = get_me['title'] if show_icons: line = "%s
%s

\n

" % (comic_title, comic_date, name) else: line = "%s
%s

\n

" % (name, comic_title, comic_date) home.write(line) home.write('

\n

Generated by pluck-comics
\n%s

' % today) home.close() if show_all: print "\tAvailable comics are:" for list_me in comic_list: print '\t' + list_me['name'] plucker-1.8/tools/pluck-comics/kingfeatures.list0100644000076400001440000003651107564443253021202 0ustar mickeusers# # $Id: kingfeatures.list,v 1.3 2002/11/13 12:33:47 nordstrom Exp $ # comic_list.append({ 'name': 'spidermn', 'page': 'http://www.kingfeatures.com/features/comics/spidermn/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'The Amazing Spiderman'}) comic_list.append({ 'name': 'apt3g', 'page': 'http://www.kingfeatures.com/features/comics/apt3g/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/Apartment_3-G\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Apartment 3G'}) comic_list.append({ 'name': 'babyblue', 'page': 'http://www.kingfeatures.com/features/comics/babyblue/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Baby Blues'}) comic_list.append({ 'name': 'bgoogle', 'page': 'http://www.kingfeatures.com/features/comics/bgoogle/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Barney Google and Snuffy Smith'}) comic_list.append({ 'name': 'bbailey', 'page': 'http://www.kingfeatures.com/features/comics/bbailey/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Beetle Bailey'}) comic_list.append({ 'name': 'bethalf', 'page': 'http://www.kingfeatures.com/features/comics/bethalf/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'The Better Half'}) comic_list.append({ 'name': 'bfriends', 'page': 'http://www.kingfeatures.com/features/comics/bfriends/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Between Friends'}) comic_list.append({ 'name': 'blondie', 'page': 'http://www.kingfeatures.com/features/comics/blondie/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Blondie'}) comic_list.append({ 'name': 'buckles', 'page': 'http://www.kingfeatures.com/features/comics/buckles/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Buckles'}) comic_list.append({ 'name': 'crock', 'page': 'http://www.kingfeatures.com/features/comics/crock/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Crock'}) comic_list.append({ 'name': 'curtis', 'page': 'http://www.kingfeatures.com/features/comics/curtis/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Curtis'}) comic_list.append({ 'name': 'dennis', 'page': 'http://www.kingfeatures.com/features/comics/dennis/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Dennis the Menace'}) comic_list.append({ 'name': 'dinette', 'page': 'http://www.kingfeatures.com/features/comics/dinette/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Dinette Set'}) comic_list.append({ 'name': 'edgecity', 'page': 'http://www.kingfeatures.com/features/comics/edgecity/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/Edge_City\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Edge City'}) comic_list.append({ 'name': 'familyc', 'page': 'http://www.kingfeatures.com/features/comics/familyc/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Family Circus'}) comic_list.append({ 'name': 'fgordon', 'page': 'http://www.kingfeatures.com/features/comics/fgordon/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Flash Gordon'}) comic_list.append({ 'name': 'fwinker', 'page': 'http://www.kingfeatures.com/features/comics/fwinker/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Funky Winkerbean'}) comic_list.append({ 'name': 'grinbear', 'page': 'http://www.kingfeatures.com/features/comics/grinbear/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Grin and Bear It'}) comic_list.append({ 'name': 'hagar', 'page': 'http://www.kingfeatures.com/features/comics/hagar/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Hagar the Horrible'}) comic_list.append({ 'name': 'hazel', 'page': 'http://www.kingfeatures.com/features/comics/hazel/aboutMaina.php', 'expr': "hat\d*.gif", 'suff': '.gif', 'base': 'http://www.kingfeatures.com/features/comics/hazel/', 'refr': 'http://www.kingfeatures.com', 'title': 'Hazel'}) comic_list.append({ 'name': 'henry', 'page': 'http://www.kingfeatures.com/features/comics/henry/aboutMaina.php', 'expr': "het\d*.gif", 'suff': '.gif', 'base': 'http://www.kingfeatures.com/features/comics/henry/', 'refr': 'http://www.kingfeatures.com', 'title': 'Henry'}) comic_list.append({ 'name': 'hi_lois', 'page': 'http://www.kingfeatures.com/features/comics/hi_lois/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Hi and Lois'}) comic_list.append({ 'name': 'jparker', 'page': 'http://www.kingfeatures.com/features/comics/jparker/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Judge Parker'}) comic_list.append({ 'name': 'katzkids', 'page': 'http://www.kingfeatures.com/features/comics/katzkids/aboutMaina.php', 'expr': "kk\d*.gif", 'suff': '.gif', 'base': 'http://www.kingfeatures.com/features/comics/katzkids/', 'refr': 'http://www.kingfeatures.com', 'title': 'Katzenjammer Kids'}) comic_list.append({ 'name': 'lockhorn', 'page': 'http://www.kingfeatures.com/features/comics/lockhorn/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'The Lockhorns'}) comic_list.append({ 'name': 'mallard', 'page': 'http://www.kingfeatures.com/features/comics/mallard/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Mallard Fillmore'}) comic_list.append({ 'name': 'mandrake', 'page': 'http://www.kingfeatures.com/features/comics/mandrake/aboutMaina.php', 'expr': "mmt\d*.gif", 'suff': '.gif', 'base': 'http://www.kingfeatures.com/features/comics/mandrake/', 'refr': 'http://www.kingfeatures.com', 'title': 'Mandrake the Magician'}) comic_list.append({ 'name': 'mtrail', 'page': 'http://www.kingfeatures.com/features/comics/mtrail/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Mark Trail'}) comic_list.append({ 'name': 'marvin', 'page': 'http://www.kingfeatures.com/features/comics/marvin/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Marvin'}) comic_list.append({ 'name': 'mworth', 'page': 'http://www.kingfeatures.com/features/comics/mworth/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Mary Worth'}) comic_list.append({ 'name': 'moosemol', 'page': 'http://www.kingfeatures.com/features/comics/moosemol/aboutMaina.php', 'expr': "mot\d*.gif", 'suff': '.gif', 'base': 'http://www.kingfeatures.com/features/comics/moosemol/', 'refr': 'http://www.kingfeatures.com', 'title': 'Moose & Molly'}) comic_list.append({ 'name': 'mutts', 'page': 'http://www.kingfeatures.com/features/comics/mutts/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Mutts'}) comic_list.append({ 'name': 'newbreed', 'page': 'http://www.kingfeatures.com/features/comics/newbreed/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'The New Breed'}) comic_list.append({ 'name': 'thenorm', 'page': 'http://www.kingfeatures.com/features/comics/thenorm/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'The Norm'}) comic_list.append({ 'name': 'fastrack', 'page': 'http://www.kingfeatures.com/features/comics/fastrack/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'On the Fastrack'}) comic_list.append({ 'name': 'pardonpl', 'page': 'http://www.kingfeatures.com/features/comics/pardonpl/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/Pardon_My_Planet\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Pardon My Planet'}) comic_list.append({ 'name': 'phantom', 'page': 'http://www.kingfeatures.com/features/comics/phantom/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'The Phantom'}) comic_list.append({ 'name': 'piranha', 'page': 'http://www.kingfeatures.com/features/comics/piranha/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Piranha Club'}) comic_list.append({ 'name': 'popeye', 'page': 'http://www.kingfeatures.com/features/comics/popeye/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Popeye'}) comic_list.append({ 'name': 'pvaliant', 'page': 'http://www.kingfeatures.com/features/comics/pvaliant/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/Prince_Valiant\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Prince Valiant'}) comic_list.append({ 'name': 'redeye', 'page': 'http://www.kingfeatures.com/features/comics/redeye/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Redeye'}) comic_list.append({ 'name': 'rmorgan', 'page': 'http://www.kingfeatures.com/features/comics/rmorgan/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Rex Morgan, M.D.'}) comic_list.append({ 'name': 'orange', 'page': 'http://www.kingfeatures.com/features/comics/orange/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Rhymes with Orange'}) comic_list.append({ 'name': 'safehavn', 'page': 'http://www.kingfeatures.com/features/comics/safehavn/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Safe Havens'}) comic_list.append({ 'name': 'sforth', 'page': 'http://www.kingfeatures.com/features/comics/sforth/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Sally Forth'}) comic_list.append({ 'name': 'sam_silo', 'page': 'http://www.kingfeatures.com/features/comics/sam_silo/aboutMaina.php', 'expr': "sst\d*.gif", 'suff': '.gif', 'base': 'http://www.kingfeatures.com/features/comics/sam_silo/', 'refr': 'http://www.kingfeatures.com', 'title': 'Sam and Silo'}) comic_list.append({ 'name': 'lagoon', 'page': 'http://www.kingfeatures.com/features/comics/lagoon/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Sherman\'s Lagoon'}) comic_list.append({ 'name': 'sixchix', 'page': 'http://www.kingfeatures.com/features/comics/sixchix/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Six Chix'}) comic_list.append({ 'name': 'slylock', 'page': 'http://www.kingfeatures.com/features/comics/slylock/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Slylock Fox and Comics for Kids'}) comic_list.append({ 'name': 'sroper', 'page': 'http://www.kingfeatures.com/features/comics/sroper/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Steve Roper and Mike Nomad'}) comic_list.append({ 'name': 'theydoit', 'page': 'http://www.kingfeatures.com/features/comics/theydoit/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'They\'ll Do It Every Time'}) comic_list.append({ 'name': 'tiger', 'page': 'http://www.kingfeatures.com/features/comics/tiger/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Tiger'}) comic_list.append({ 'name': 'tgroove', 'page': 'http://www.kingfeatures.com/features/comics/tgroove/aboutMaina.php', 'expr': "tgt\d*.gif", 'suff': '.gif', 'base': 'http://www.kingfeatures.com/features/comics/tgroove/', 'refr': 'http://www.kingfeatures.com', 'title': 'Tina\'s Groove'}) comic_list.append({ 'name': 'trudy', 'page': 'http://www.kingfeatures.com/features/comics/trudy/aboutMaina.php', 'expr': "trt\d*.gif", 'suff': '.gif', 'base': 'http://www.kingfeatures.com/features/comics/trudy/', 'refr': 'http://www.kingfeatures.com', 'title': 'Trudy'}) comic_list.append({ 'name': 'tumblewd', 'page': 'http://www.kingfeatures.com/features/comics/tumblewd/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Tumbleweeds'}) comic_list.append({ 'name': 'zippy', 'page': 'http://www.kingfeatures.com/features/comics/zippy/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Zippy the Pinhead'}) comic_list.append({ 'name': 'zits', 'page': 'http://www.kingfeatures.com/features/comics/zits/aboutMaina.php', 'expr': "http://\w*.\w*.\w*/content/\w*\?date=\d*", 'suff': '.gif', 'base': '', 'refr': 'http://www.kingfeatures.com', 'title': 'Zits'}) plucker-1.8/tools/pluck-comics/other.comics.list0100644000076400001440000001116307564443253021104 0ustar mickeusers# # $Id: other.comics.list,v 1.3 2002/11/13 12:33:47 nordstrom Exp $ # comic_list.append({ 'name': 'goats', 'page': 'http://www.goats.com/', 'expr': "\d+/goats\d+\.gif", 'suff': '.gif', 'base': 'http://www.goats.com/comix/', 'title': 'Goats'}) comic_list.append({ 'name': 'gpf', 'page': 'http://www.gpf-comics.com/', 'expr': "gpf\d+\.gif", 'suff': '.gif', 'base': 'http://www.gpf-comics.com/comics/', 'title': 'General Protection Fault'}) comic_list.append({ 'name': 'pennyarcade', 'page': 'http://www.penny-arcade.com/view.php3', 'expr': "images/\d+/\d+\w\.gif", 'suff': '.gif', 'base': 'http://www.penny-arcade.com/', 'title': 'Penny Arcade'}) comic_list.append({ 'name': 'user_friendly', 'page': 'http://www.userfriendly.org/static/', 'expr': "\d\d\w\w\w/xuf\d+\.gif", 'suff': '.gif', 'base': 'http://www.userfriendly.org/cartoons/archives/', 'title': 'User Friendly'}) comic_list.append({ 'name': 'newyorker', 'page': 'http://www.cartoonbank.com/cartoon_channel.asp', 'expr': "\d+_\w+\.gif", 'suff': '.gif', 'base': 'http://www.cartoonbank.com/e_images/', 'title': 'New Yorker'}) comic_list.append({ 'name': 'moeandron', 'page': 'http://www.jeffpaige.com', 'expr': "newstrip.gif", 'suff': '.gif', 'base': 'http://www.jeffpaige.com/comics/', 'title': 'The Backyard Adventures of Moe and Ron'}) comic_list.append({ 'name': 'mostlybusiness', 'page': 'http://www.tedgoff.com/today/', 'expr': "today.gif", 'suff': '.gif', 'base': 'http://www.tedgoff.com/today/', 'title': 'Mostly Business'}) comic_list.append({ 'name': 'planetearth', 'page': 'http://www.thesnakefarm.com/strips/planetearth.php', 'expr': "\d+.gif", 'suff': '.gif', 'base': 'http://www.thesnakefarm.com/images/planetearth/', 'title': 'Planet Earth (and other tourist traps)'}) comic_list.append({ 'name': 'mudpie', 'page': 'http://www.gilchriststudios.com/mudpie/mudpiecomics.asp', 'expr': "mudpie\d+.jpg", 'suff': '.jpg', 'base': 'http://www.gilchriststudios.com/FTP-mudpie/', 'title': 'Mudpie'}) comic_list.append({ 'name': 'inniesandoutties', 'page': 'http://www.inniesandoutties.com/', 'expr': "front.jpg", 'suff': '.jpg', 'base': 'http://www.inniesandoutties.com/images/', 'title': 'Mudpie'}) comic_list.append({ 'name': 'curtoons', 'page': 'http://www.curtoons.com/Todays%20Toon.htm', 'expr': "toon\d+.gif", 'suff': '.gif', 'base': 'http://www.curtoons.com/cartoons/', 'title': 'Curtoons'}) comic_list.append({ 'name': 'offthemark', 'page': 'http://www.offthemark.com/daily.asp', 'expr': "\d+.gif", 'suff': '.gif', 'base': 'http://www.offthemark.com/rotate/', 'title': 'Off the Mark'}) comic_list.append({ 'name': 'notquiteright', 'page': 'http://www.notquiteright.com/', 'expr': "todaystoon.gif", 'suff': '.gif', 'base': 'http://www.notquiteright.com/wow/', 'title': 'Not Quite Right'}) comic_list.append({ 'name': 'squinkers', 'page': 'http://www.squinkers.com/sqkrs/Squinker.html', 'expr': "today.gif", 'suff': '.gif', 'base': 'http://www.squinkers.com/sqkrs/Images/', 'title': 'Squinkers'}) comic_list.append({ 'name': 'freneticwanderings', 'page': 'http://www.swensonfunnies.com/html/dailygag.html', 'expr': "dailygag.gif", 'suff': '.gif', 'base': 'http://www.swensonfunnies.com/dailies/', 'title': 'Frenetic Wanderings'}) comic_list.append({ 'name': 'scragends', 'page': 'http://www.btinternet.com/~scragends/', 'expr': "scragend.jpg", 'suff': '.jpg', 'base': 'http://www.btinternet.com/~scragends/', 'title': 'Scrags Ends'}) comic_list.append({ 'name': 'snapshots', 'page': 'http://www.jasonlove.com/', 'expr': "\w+\d+.gif", 'suff': '.gif', 'base': 'http://www.jasonlove.com/snaps-tr/', 'title': 'Snapshots'}) comic_list.append({ 'name': 'deepend', 'page': 'http://www.deep-end.com/', 'expr': "daily.gif", 'suff': '.gif', 'base': 'http://www.deep-end.com/daily/', 'title': 'The Deep End'}) comic_list.append({ 'name': 'stannisaac', 'page': 'http://www.stan-isaac.com/newstrip.html', 'expr': "dailystan.gif", 'suff': '.gif', 'base': 'http://www.swensonfunnies.com/dailies/', 'title': 'Stan \'N\' Isaac'}) comic_list.append({ 'name': 'pcweenies', 'page': 'http://www.pcweenies.com/', 'expr': "\w+_\d+.jpg", 'suff': '.jpg', 'base': 'http://www.pcweenies.com/new_strips/', 'title': 'The PC Weenies'}) comic_list.append({ 'name': 'dadndorothy', 'page': 'http://www.dadanddorothy.com/', 'expr': "\d+\w+.gif", 'suff': '.gif', 'base': 'http://www.dadanddorothy.com/', 'title': 'Dad & Dorothy'}) comic_list.append({ 'name': 'covereddish', 'page': 'http://www.botcw.com/thom/', 'expr': "today.gif", 'suff': '.gif', 'base': 'http://www.botcw.com/thom/images/', 'title': 'Church of the Covered Dish'}) plucker-1.8/tools/unpluck/0040755000076400001440000000000010052675410014667 5ustar mickeusersplucker-1.8/tools/unpluck/README0100644000076400001440000000062507473014653015560 0ustar mickeusersThis directory contains a library to access the records of a Plucker document, as well as some of the metadata about the document such as the title. To build this, you will need * the zlib library, from www.gzip.org/zlib/, version 1.1.4 or later. The key file here is unpluck.c, which provides access to the records and data of a Plucker document. The exported functions are documented in unpluck.h. plucker-1.8/tools/unpluck/unpluck.c0100644000076400001440000010574107773642051016534 0ustar mickeusers/* -*- mode: c; indent-tabs-mode: nil; -*- * $Id: unpluck.c,v 1.12 2003/12/28 20:59:21 chrish Exp $ * * unpluck -- a library to read Plucker data files * Copyright (c) 2002, Bill Janssen * * 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. * */ #if !defined(WIN32) #include /* for lseek, etc. */ #else #include #endif #include #include #include /* for fstat() */ #include /* for strndup() */ #include /* for errno */ #include /* for O_RDONLY */ #include /* for assert() */ #include #include "unpluck.h" #include "unpluckint.h" /***********************************************************************/ /***********************************************************************/ /***** *****/ /***** Decompression code (taken from the Plucker PalmOS viewer *****/ /***** sources, Copyright (c) 1998-2002, by Mark Ian Lillywhite *****/ /***** and Michael Nordstrm, also under the GPL) *****/ /***** *****/ /***********************************************************************/ /***********************************************************************/ /* uncompress DOC compressed document/image */ static unsigned int UncompressDOC ( unsigned char* src, /* in: compressed document */ unsigned int src_len, /* in: size of compressed document */ unsigned char* dest, /* out: buffer to put uncompressed document in */ unsigned int dest_len /* out: size of buffer to put uncompressed document in */ ) { unsigned int offset; unsigned int src_index; unsigned int dest_index; assert (src != NULL && src_len != 0 && dest != NULL && dest_len != 0); offset = 0; src_index = 0; dest_index = 0; memset (dest, 0, dest_len); while (src_index < src_len) { unsigned int token; token = (unsigned int) src[src_index++]; if (0 < token && token < 9) { while (token != 0) { dest[dest_index++] = src[src_index++]; token--; } } else if (token < 0x80) { dest[dest_index++] = token; } else if (0xc0 <= token) { dest[dest_index++] = ' '; dest[dest_index++] = token ^ 0x80; } else { int m; int n; token *= 256; token += src[src_index++]; m = (token & 0x3fff) / 8; n = token & 7; n += 3; while (n != 0) { dest[dest_index] = dest[dest_index - m]; dest_index++; n--; } } } assert (src_index == src_len && dest_index == dest_len); return 1; } /* uncompress ZLib compressed document/image */ static unsigned int UncompressZLib ( unsigned char* src, /* in: compressed document */ unsigned int src_len, /* in: size of compressed document */ unsigned char* dest, /* out: buffer to put uncompressed document in */ unsigned int dest_len, /* out: size of buffer to put uncompressed document in */ unsigned char* owner_id /* in: owner-id key */ ) { z_stream z; unsigned int err; unsigned int keylen; unsigned int i; unsigned char keybuf[OWNER_ID_HASH_LEN]; assert (src != NULL && src_len != 0 && dest != NULL && dest_len != 0); keylen = (owner_id == NULL) ? 0 : MIN (src_len, OWNER_ID_HASH_LEN); memset (&z, 0, sizeof z); if (owner_id != NULL) { for (i = 0; i < keylen; i++) keybuf[i] = src[i] ^ owner_id[i]; z.next_in = keybuf; z.avail_in = keylen; } else { z.next_in = src; z.avail_in = src_len; } z.next_out = dest; z.avail_out = dest_len; err = inflateInit (&z); if (err != Z_OK) { return err; } do { if (z.avail_in == 0 && keylen > 0) { z.next_in = src + keylen; z.avail_in = src_len - keylen; } err = inflate (&z, Z_SYNC_FLUSH); } while (err == Z_OK); if (err != Z_STREAM_END) return err; assert (z.total_out == dest_len); return inflateEnd (&z); } /***********************************************************************/ /***********************************************************************/ /***** *****/ /***** "Open" the DB (read the headers and parse the various *****/ /***** metadata, like URLs, default categories, charsets, etc.) *****/ /***** *****/ /***********************************************************************/ /***********************************************************************/ static void FreePluckerDoc ( plkr_Document* doc ) { if (doc->name != NULL) free (doc->name); if (doc->title != NULL) free (doc->title); if (doc->author != NULL) free (doc->author); if (doc->records != NULL) { int i; for (i = 0; i < doc->nrecords; i++) { if (doc->records[i].cache != NULL) free (doc->records[i].cache); } free (doc->records); } if (doc->urls != NULL) free (doc->urls); if (doc->handle != NULL) doc->handle->free (doc->handle); } static plkr_DataRecord* FindRecordByIndex ( plkr_Document* doc, int record_index ) { int imin; int imax; int itest; for (imin = 0, imax = doc->nrecords; imin < imax;) { itest = imin + (imax - imin) / 2; /* _plkr_message("imin = %2d, imax = %2d, itest = %2d (%2d), record_index = %2d", imin, imax, itest, doc->records[itest].uid, record_index); */ if (doc->records[itest].uid == record_index) return &doc->records[itest]; else if (record_index > doc->records[itest].uid) imin = itest + 1; else if (record_index < doc->records[itest].uid) imax = itest; } return NULL; } static int GetUncompressedRecord ( plkr_Document* doc, plkr_DBHandle handle, int record_index, unsigned char* buffer, int buffer_size, plkr_DataRecordType expected_type, unsigned char** buffer_out, int* buffer_size_out, plkr_DataRecord** record_out ) { /* read whole data record, including header, into buffer. If some part of the record is compressed, uncompress it. If "buffer" is NULL, allocate enough bytes to fit. Returns TRUE if read is successful, and sets "buffer_out" and "buffer_size_out" and "record_out" on successful return. */ plkr_DataRecord* record; unsigned char* tbuffer = buffer; int size_needed; int blen = buffer_size; record = FindRecordByIndex (doc, record_index); if (record == NULL) { _plkr_message ("No record with index %d", record_index); return FALSE; }; if (expected_type != PLKR_DRTYPE_NONE && record->type != expected_type) { _plkr_message ("Record %d has unexpected type %d; expected %d", record_index, record->type, expected_type); return FALSE; } /* figure size needed */ size_needed = record->uncompressed_size + 8; if ((record->type == PLKR_DRTYPE_TEXT_COMPRESSED) || (record->type == PLKR_DRTYPE_TEXT)) size_needed += 4 * record->nparagraphs; if (!buffer) { if (buffer_out == NULL) { _plkr_message ("No output buffer"); return FALSE; } else if (record->cache) { tbuffer = record->cache; size_needed = record->cached_size; } else { tbuffer = (unsigned char *) malloc (size_needed); blen = size_needed; } } else { tbuffer = buffer; if (buffer_size < size_needed) { _plkr_message ("Buffer too small; needs %d", size_needed); return FALSE; } else if (record->cache) { memcpy (buffer, record->cache, record->cached_size); size_needed = record->cached_size; } } if (!record->cache) { if ((record->type == PLKR_DRTYPE_TEXT_COMPRESSED) || (record->type == PLKR_DRTYPE_IMAGE_COMPRESSED) || (record->type == PLKR_DRTYPE_TABLE_COMPRESSED) || (record->type == PLKR_DRTYPE_GLYPHPAGE) || (record->type == PLKR_DRTYPE_LINKS_COMPRESSED)) { unsigned char *start_of_data, *output_ptr; int len_of_data, buffer_remaining, buf_to_use; unsigned char *buf = malloc (record->size); if (!handle->seek (handle, record->offset) || (handle->read (handle, buf, record->size, record->size) != record->size)) { _plkr_message ("Bad read from DBHandle while reading record %d", record->uid); free (buf); if (tbuffer != buffer) free (tbuffer); return FALSE; } #if 0 _plkr_message ("data record %d (%d): uid is %d, # paras = %d, size = %d, type = %d", record_index, record->size, (buf[0] << 8) + buf[1], (buf[2] << 8) + buf[3], (buf[4] << 8) + buf[5], buf[6]); #endif memcpy (tbuffer, buf, 8); output_ptr = tbuffer + 8; buffer_remaining = blen - 8; start_of_data = buf + 8; len_of_data = record->size - 8; if (record->type == PLKR_DRTYPE_TEXT_COMPRESSED) { /* skip over the paragraph headers */ memcpy (output_ptr, start_of_data, 4 * record->nparagraphs); start_of_data += (4 * record->nparagraphs); len_of_data -= (4 * record->nparagraphs); output_ptr += (4 * record->nparagraphs); buffer_remaining -= (4 * record->nparagraphs); } buf_to_use = size_needed - (start_of_data - buf); if (doc->compression == PLKR_COMPRESSION_ZLIB) { if (UncompressZLib (start_of_data, len_of_data, output_ptr, buf_to_use, (doc->owner_id_required ? doc-> owner_id_key : NULL)) != Z_OK) { _plkr_message ("Bad Zlib uncompress of record %d", record_index); free (buf); if (tbuffer != buffer) free (tbuffer); return FALSE; }; } else if (doc->compression == PLKR_COMPRESSION_DOC) { if (UncompressDOC (start_of_data, len_of_data, output_ptr, buf_to_use) != 1) { _plkr_message ("Bad DOC uncompress of record %d", record_index); free (buf); if (tbuffer != buffer) free (tbuffer); return FALSE; }; } free (buf); } else { /* all the record types which don't use compression */ if (!handle->seek (handle, record->offset) || (handle->read (handle, tbuffer, blen, size_needed) != size_needed)) { _plkr_message ("Bad read from DBHandle while reading record %d", record->uid); if (tbuffer != buffer) free (tbuffer); return FALSE; } } } if (record_out) *record_out = record; if (buffer_out) *buffer_out = tbuffer; if (buffer_size_out) *buffer_size_out = size_needed; return TRUE; } static int ParseCategories ( plkr_Document* newdoc, plkr_DBHandle handle ) { struct _plkr_CategoryName* categories; struct _plkr_CategoryName* newc; plkr_DataRecord *record; unsigned char* buf; unsigned char* ptr; int bufsize; if (GetUncompressedRecord (newdoc, handle, newdoc->default_category_record_uid, NULL, 0, PLKR_DRTYPE_CATEGORY, &buf, &bufsize, &record)) { /* keep the record data, since the list of char * ptrs will point into it */ record->cache = buf; record->cached_size = bufsize; categories = NULL; for (ptr = buf + 8; (ptr - buf) < bufsize;) { newc = (struct _plkr_CategoryName *) malloc (sizeof (struct _plkr_CategoryName)); newc->next = categories; categories = newc; newc->name = ptr; ptr += (strlen (ptr) + 1); } newdoc->default_categories = categories; return TRUE; } else { return FALSE; } } static int ParseMetadata ( plkr_Document* newdoc, plkr_DBHandle handle ) { unsigned char* buf; unsigned char* ptr; int bufsize; int nsubrecords; int typecode; int subrecord_length; int i; if (!GetUncompressedRecord (newdoc, handle, newdoc->metadata_record_uid, NULL, 0, PLKR_DRTYPE_METADATA, &buf, &bufsize, NULL)) { return FALSE; } else { nsubrecords = (buf[8] << 8) + buf[9]; for (i = 0, ptr = buf + 10; i < nsubrecords; i++) { typecode = (ptr[0] << 8) + ptr[1]; subrecord_length = ((ptr[2] << 8) + ptr[3]) * 2; if (typecode == PLKR_MDTYPE_DEFAULTCHARSET) { newdoc->default_charset_mibenum = (ptr[4] << 8) + ptr[5]; ptr += 6; } else if (typecode == PLKR_MDTYPE_EXCEPTCHARSETS) { int i, n, record_id, mibenum; plkr_DataRecord *record; ptr += 4; for (i = 0, n = subrecord_length / 4; i < n; i++, ptr += 4) { record_id = (ptr[0] << 8) + ptr[1]; mibenum = (ptr[2] << 8) + ptr[3]; record = FindRecordByIndex (newdoc, record_id); if (record == NULL) { _plkr_message ("Can't find record with id %d", record_id); free (buf); return FALSE; } record->charset_mibenum = mibenum; } } else if (typecode == PLKR_MDTYPE_OWNERIDCRC) { newdoc->owner_id_required = TRUE; ptr += 8; } else if (typecode == PLKR_MDTYPE_AUTHOR) { newdoc->author = _plkr_strndup (ptr + 4, subrecord_length); ptr += (4 + subrecord_length); } else if (typecode == PLKR_MDTYPE_TITLE) { newdoc->title = _plkr_strndup (ptr + 4, subrecord_length); ptr += (4 + subrecord_length); } else if (typecode == PLKR_MDTYPE_PUBLICATIONTIME) { newdoc->publication_time = READ_BIGENDIAN_LONG (ptr + 4) - PLKR_TIMEADJUST; ptr += 8; } else { _plkr_message ("Bad metadata typecode %d encountered in metadata record", typecode); free (buf); return FALSE; } } free (buf); return TRUE; } } static int ParseURLs ( plkr_Document* newdoc, plkr_DBHandle handle ) { plkr_DataRecord* record; unsigned char* buf; unsigned char* ptr; char** urls; int id; int i; int n; int count; int nurls; int bufsize; struct url_index_record { int last_url_index; int record_id; } *records; buf = NULL; urls = NULL; records = NULL; if (!GetUncompressedRecord (newdoc, handle, newdoc->urls_index_record_uid, NULL, 0, PLKR_DRTYPE_LINKS_INDEX, &buf, &bufsize, NULL)) { return FALSE; } else { n = ((buf[4] << 8) + buf[5]) / 4; records = (struct url_index_record *) malloc (n * sizeof (*records)); for (i = 0, nurls = 0; i < n; i++) { ptr = buf + 8 + (i * 4); records[i].last_url_index = (ptr[0] << 8) + ptr[1]; records[i].record_id = (ptr[2] << 8) + ptr[3]; #ifdef DEBUGURLS _plkr_message ("index %3d: last = %d, record_id = %d", i, records[i].last_url_index, records[i].record_id); #endif /* def DEBUGURLS */ nurls = MAX (nurls, records[i].last_url_index); } free (buf); buf = NULL; } urls = (char **) malloc (nurls * sizeof (char *)); memset (urls, 0, nurls * sizeof (char *)); for (count = 0, i = 0; i < n; i++) { id = records[i].record_id; if (!GetUncompressedRecord (newdoc, handle, id, NULL, 0, PLKR_DRTYPE_NONE, &buf, &bufsize, &record)) { goto errout4; } if (record->type != PLKR_DRTYPE_LINKS && record->type != PLKR_DRTYPE_LINKS_COMPRESSED) { _plkr_message ("Supposed URLs record has bad type %d", record->type); goto errout4; } record->cache = buf; record->cached_size = bufsize; buf = NULL; for (ptr = record->cache + 8; (ptr - record->cache) < record->cached_size; ptr += (strlen (ptr) + 1)) { #ifdef DEBUGURLS _plkr_message ("%3d: %s", count, ptr); #endif /* def DEBUGURLS */ assert (count < nurls); urls[count++] = ptr; } } free (records); newdoc->urls = urls; newdoc->nurls = nurls; return TRUE; errout4: if (buf != NULL) free (buf); if (urls != NULL) free (urls); if (records != NULL) free (records); return FALSE; } plkr_Document* plkr_OpenDoc ( plkr_DBHandle handle ) { ReservedRecordEntry reserved[MAX_RESERVED]; plkr_DataRecord* record; plkr_Document* newdoc; unsigned char utilbuf[128]; static char id_stamp[8] = "DataPlkr"; int i; int nreserved; int records_size; int compression; if (!handle->seek (handle, 0) || (handle->read (handle, utilbuf, sizeof (utilbuf), 78) != 78)) { _plkr_message ("Bad read of DB header"); return NULL; } /* check for type stamp */ if (strncmp ((char *) (utilbuf + 60), id_stamp, 8) != 0) { _plkr_message ("Bad magic number"); return NULL; } /* check for version 1 */ i = (utilbuf[34] << 8) + utilbuf[35]; if (i != 1) { _plkr_message ("Not version 1 of Plucker format; version %d", i); return NULL; } /* get the title, creation time, and last modification time from header */ newdoc = (plkr_Document *) malloc (sizeof (plkr_Document)); memset (newdoc, 0, sizeof (plkr_Document)); newdoc->name = _plkr_strndup (utilbuf, MIN (strlen (utilbuf), 32)); newdoc->creation_time = (time_t) ((utilbuf[36] << 24) + (utilbuf[37] << 16) + (utilbuf[38] << 8) + utilbuf[39] - PLKR_TIMEADJUST); newdoc->modification_time = (time_t) ((utilbuf[40] << 24) + (utilbuf[41] << 16) + (utilbuf[42] << 8) + utilbuf[43] - PLKR_TIMEADJUST); newdoc->nrecords = (utilbuf[76] << 8) + utilbuf[77]; /* Now read the record-list to find out where the records are */ records_size = sizeof (plkr_DataRecord) * newdoc->nrecords; newdoc->records = (plkr_DataRecord *) malloc (records_size); memset (newdoc->records, 0, records_size); for (i = 0; i < newdoc->nrecords; i++) { if (handle->read (handle, utilbuf, sizeof (utilbuf), 8) != 8) { _plkr_message ("Bad read of record list"); FreePluckerDoc (newdoc); return NULL; } newdoc->records[i].offset = (utilbuf[0] << 24) + (utilbuf[1] << 16) + (utilbuf[2] << 8) + utilbuf[3]; } /* process the index record */ if (!handle->seek (handle, newdoc->records[0].offset) || (handle->read (handle, utilbuf, sizeof (utilbuf), 6) != 6)) { _plkr_message ("Bad read of index record"); FreePluckerDoc (newdoc); return NULL; } if ((utilbuf[0] << 8) + utilbuf[1] != 1) { _plkr_message ("index record has bad UID %d", (utilbuf[0] << 8) + utilbuf[1]); FreePluckerDoc (newdoc); return NULL; } newdoc->records[0].uid = 1; compression = (utilbuf[2] << 8) + utilbuf[3]; if (compression == PLKR_COMPRESSION_DOC) newdoc->compression = PLKR_COMPRESSION_DOC; else if (compression == PLKR_COMPRESSION_ZLIB) newdoc->compression = PLKR_COMPRESSION_ZLIB; else { _plkr_message ("Unknown compression type %d", compression); FreePluckerDoc (newdoc); return NULL; } nreserved = (utilbuf[4] << 8) + utilbuf[5]; if (nreserved > MAX_RESERVED) { _plkr_message ("Too many reserved records (%d) for software", nreserved); FreePluckerDoc (newdoc); return NULL; } for (i = 0; i < nreserved; i++) { if (handle->read (handle, utilbuf, sizeof (utilbuf), 4) != 4) { _plkr_message ("Bad read of reserved record list"); FreePluckerDoc (newdoc); return NULL; } reserved[i].name = (utilbuf[0] << 8) + utilbuf[1]; reserved[i].uid = (utilbuf[2] << 8) + utilbuf[3]; } /* OK, now process the data records */ newdoc->max_record_size = 0; for (i = 1; i < newdoc->nrecords; i++) { record = newdoc->records + i; if (!handle->seek (handle, record->offset) || (handle->read (handle, utilbuf, sizeof (utilbuf), 8) != 8)) { _plkr_message ("Can't read header of record %d", i); FreePluckerDoc (newdoc); return NULL; } newdoc->records[i - 1].size = record->offset - newdoc->records[i - 1].offset; record->uid = (utilbuf[0] << 8) + utilbuf[1]; record->nparagraphs = (utilbuf[2] << 8) + utilbuf[3]; record->uncompressed_size = (utilbuf[4] << 8) + utilbuf[5]; record->type = utilbuf[6]; newdoc->max_record_size = MAX (newdoc->max_record_size, record->uncompressed_size); } /* To get the size of the last record we subtract its offset from the total size of the DB. */ if ((i = handle->size (handle)) == 0) { _plkr_message ("Can't obtain size of DB"); FreePluckerDoc (newdoc); return NULL; }; record = newdoc->records + (newdoc->nrecords - 1); record->size = i - record->offset; /* make sure the uncompressed size is set, now that we know the record sizes */ for (i = 0; i < newdoc->nrecords; i++) { record = newdoc->records + i; if (record->uncompressed_size == 0) { if (record->type == PLKR_DRTYPE_LINKS_COMPRESSED || record->type == PLKR_DRTYPE_TEXT_COMPRESSED || record->type == PLKR_DRTYPE_TABLE_COMPRESSED || record->type == PLKR_DRTYPE_IMAGE_COMPRESSED) { _plkr_message ("Bad uncompressed size 0 in record uid %d", record->uid); FreePluckerDoc (newdoc); return NULL; } else { record->uncompressed_size = record->size - 8; } } #ifdef DEBUGOPEN { static char *types[] = { "TEXT", "TEXTC", "IMAGE", "IMAGEC", "MAILTO", "URLINDEX", "URLS", "URLSC", "BOOKMARKS", "CATEGORIES", "METADATA" }; _plkr_message ("%3d: type=%10s, offset=%07x, size=%5d, uncompressed_size=%5d", record->uid, types[MIN (record->type, sizeof (types) / sizeof (char *))], record->offset, record->size, record->uncompressed_size); } #endif } /* find the reserved records */ /* do metadata first, to find out whether we need an owner_id key */ for (i = 0; i < nreserved; i++) { if (reserved[i].name == PLKR_METADATA_NAME) { newdoc->metadata_record_uid = reserved[i].uid; if (!ParseMetadata (newdoc, handle)) { _plkr_message ("Error parsing metadata record"); FreePluckerDoc (newdoc); return NULL; } } } if (newdoc->owner_id_required) { /* we need to set up the owner-id key before uncompressing any records... */ char *owner_id = plkr_GetConfigString (NULL, "owner_id", NULL); if (owner_id != NULL) { unsigned long crc; int owner_id_len = strlen (owner_id); crc = crc32 (0L, NULL, 0); crc = crc32 (crc, owner_id, owner_id_len); for (i = 0; i < 10; i++) { crc = crc32 (crc, owner_id, owner_id_len); newdoc->owner_id_key[(i * 4) + 0] = (crc >> 24) & 0xFF; newdoc->owner_id_key[(i * 4) + 1] = (crc >> 16) & 0xFF; newdoc->owner_id_key[(i * 4) + 2] = (crc >> 8) & 0xFF; newdoc->owner_id_key[(i * 4) + 3] = crc & 0xFF; } } else { _plkr_message ("Document requires owner-id to open"); FreePluckerDoc (newdoc); return NULL; } } /* now do the rest of the reserved records */ for (i = 0; i < nreserved; i++) { if (reserved[i].name == PLKR_HOME_NAME) newdoc->home_record_uid = reserved[i].uid; else if (reserved[i].name == PLKR_DEFAULT_CATEGORY_NAME) { newdoc->default_category_record_uid = reserved[i].uid; if (!ParseCategories (newdoc, handle)) { _plkr_message ("Error parsing default-categories record"); FreePluckerDoc (newdoc); return NULL; } } else if (reserved[i].name == PLKR_URLS_INDEX_NAME) { newdoc->urls_index_record_uid = reserved[i].uid; if (!ParseURLs (newdoc, handle)) { _plkr_message ("Error parsing URLs records"); FreePluckerDoc (newdoc); return NULL; } } } newdoc->handle = handle; #ifdef DEBUGOPEN /* test the record fetch by fetching them! */ for (i = 1; i < newdoc->nrecords; i++) { plkr_DataRecordType type; int n; printf ("==============================================\n" "record %3d (%d bytes)\n", newdoc->records[i].uid, newdoc->records[i].size); (void) plkr_GetRecordBytes (newdoc, newdoc->records[i].uid, &n, &type); } #endif return newdoc; } void plkr_CloseDoc ( plkr_Document * doc ) { if (doc == NULL) { _plkr_message ("Attempt to free NULL doc"); } else { FreePluckerDoc (doc); free (doc); } } /***********************************************************************/ /***********************************************************************/ /***** *****/ /***** An implementation of a file-based DBHandle *****/ /***** *****/ /***********************************************************************/ /***********************************************************************/ static int FpSeek ( plkr_DBHandle handle, long offset ) { long result; result = lseek ((int) (handle->dbprivate), offset, SEEK_SET); if (result != offset) { _plkr_message ("Unable to seek fp %d to offset %d -- %d instead\n", (int) (handle->dbprivate), offset, result); } return (result == offset); } static int FpRead ( plkr_DBHandle handle, unsigned char* buffer, int buffersize, int readsize ) { int result; result = read ((int) (handle->dbprivate), buffer, MIN (buffersize, readsize)); if (result != readsize) { _plkr_message ("Unable to read %d bytes from fp %d -- read %d instead\n", MIN (buffersize, readsize), (int) (handle->dbprivate), result); } return (result); } static void FpFree ( plkr_DBHandle handle ) { int fp = (int) (handle->dbprivate); if (fp > 0) close (fp); } static long FpSize ( plkr_DBHandle handle ) { int fp = (int) (handle->dbprivate); struct stat buf; if (fstat (fp, &buf) != 0) { _plkr_message ("Can't stat file; errno %d", errno); return 0; }; return buf.st_size; } plkr_Document* plkr_OpenDBFile ( char* filename ) { plkr_DBHandle handle; plkr_Document* doc; int fp; #if !defined(WIN32) fp = open (filename, O_RDONLY); #else fp = open (filename, O_RDONLY | O_BINARY); #endif if (fp < 0) { _plkr_message ("Can't open file %s", filename); return NULL; } handle = (plkr_DBHandle) malloc (sizeof (*handle)); handle->dbprivate = (void *) fp; handle->seek = FpSeek; handle->read = FpRead; handle->free = FpFree; handle->size = FpSize; doc = plkr_OpenDoc (handle); if (doc == NULL) close (fp); return doc; } /***********************************************************************/ /***********************************************************************/ /***** *****/ /***** Routines to access individual uncompressed records *****/ /***** *****/ /***********************************************************************/ /***********************************************************************/ int plkr_CopyRecordBytes ( plkr_Document* doc, int record_index, unsigned char* output_buffer, int output_buffer_size, plkr_DataRecordType* type ) { plkr_DataRecord* record; int output_size; if (!FindRecordByIndex (doc, record_index)) return 0; if (!GetUncompressedRecord (doc, doc->handle, record_index, output_buffer, output_buffer_size, PLKR_DRTYPE_NONE, NULL, &output_size, &record)) return 0; else { *type = record->type; return output_size; } } unsigned char *plkr_GetRecordBytes ( plkr_Document* doc, int record_index, int* size, plkr_DataRecordType* type ) { plkr_DataRecord* record; unsigned char* buf; if (!FindRecordByIndex (doc, record_index)) return NULL; if (!GetUncompressedRecord (doc, doc->handle, record_index, NULL, 0, PLKR_DRTYPE_NONE, &buf, size, &record)) return NULL; else { if (!record->cache) { record->cache = buf; record->cached_size = *size; } *type = record->type; return buf; } } int plkr_GetHomeRecordID ( plkr_Document* doc ) { return doc->home_record_uid; } char* plkr_GetName ( plkr_Document* doc ) { return doc->name; } char* plkr_GetTitle ( plkr_Document* doc ) { return doc->title; } char* plkr_GetAuthor ( plkr_Document* doc ) { return doc->author; } int plkr_GetDefaultCharset ( plkr_Document* doc ) { return doc->default_charset_mibenum; } unsigned long plkr_GetPublicationTime ( plkr_Document* doc ) { if (doc->publication_time) return (unsigned long) doc->publication_time; else return (unsigned long) doc->creation_time; } plkr_CategoryList plkr_GetDefaultCategories ( plkr_Document* doc ) { return doc->default_categories; } int plkr_GetRecordCount ( plkr_Document* doc ) { return doc->nrecords; } int plkr_GetMaxRecordSize ( plkr_Document* doc ) { return doc->max_record_size; } char* plkr_GetRecordURL ( plkr_Document * doc, int record_index ) { if (record_index < 1 || record_index > doc->nurls) return NULL; else return (doc->urls[record_index - 1]); } int plkr_HasRecordWithID ( plkr_Document* doc, int record_index ) { return (FindRecordByIndex (doc, record_index) != NULL); } int plkr_GetRecordType ( plkr_Document* doc, int record_index ) { plkr_DataRecord* r; r = FindRecordByIndex (doc, record_index); if (r) return r->type; else return PLKR_DRTYPE_NONE; } int plkr_GetRecordCharset ( plkr_Document* doc, int record_index ) { plkr_DataRecord* r; r = FindRecordByIndex (doc, record_index); if (r && ((r->type == PLKR_DRTYPE_TEXT_COMPRESSED) || (r->type == PLKR_DRTYPE_TEXT))) { if (r->charset_mibenum == 0) return doc->default_charset_mibenum; else return r->charset_mibenum; } else return 0; } plucker-1.8/tools/unpluck/unpluck.h0100644000076400001440000002632307773642051016537 0ustar mickeusers/* -*- mode: c; indent-tabs-mode: nil; -*- * $Id: unpluck.h,v 1.8 2003/12/28 20:59:21 chrish Exp $ * * unpluck -- a library to read Plucker data files * Copyright (c) 2002, Bill Janssen * * 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. * */ /* * This header file should be included after an #include of glib.h */ /* This represents a raw Palm DB. It's intended to be an abstraction of a file pointer, so that raw memory can also be used. */ typedef struct plkr_DBHandle_s *plkr_DBHandle; struct plkr_DBHandle_s { void *dbprivate; /* Call seek to position the DB stream at the "offset" byte from the start of the DB. Returns non-zero if seek has been successfully done, zero otherwise. */ int ( *seek ) ( plkr_DBHandle handle, long offset ); /* Call read to read "readsize" bytes into "buffer", which is at least "buffersize" bytes large. Returns number of bytes read. */ int ( *read ) ( plkr_DBHandle handle, unsigned char *buffer, int buffersize, int readsize ); /* When called will return total size of DB */ long ( *size ) ( plkr_DBHandle handle ); /* Hook that will be called when unpluck finishes with the handle. */ void ( *free ) ( plkr_DBHandle handle ); }; typedef enum { PLKR_DRTYPE_TEXT = 0, PLKR_DRTYPE_TEXT_COMPRESSED = 1, PLKR_DRTYPE_IMAGE = 2, PLKR_DRTYPE_IMAGE_COMPRESSED = 3, PLKR_DRTYPE_MAILTO = 4, PLKR_DRTYPE_LINKS_INDEX = 5, PLKR_DRTYPE_LINKS = 6, PLKR_DRTYPE_LINKS_COMPRESSED = 7, PLKR_DRTYPE_BOOKMARKS = 8, PLKR_DRTYPE_CATEGORY = 9, PLKR_DRTYPE_METADATA = 10, PLKR_DRTYPE_GLYPHPAGE = 11, PLKR_DRTYPE_FONT_PAGE = 12, PLKR_DRTYPE_TABLE = 13, PLKR_DRTYPE_TABLE_COMPRESSED = 14, PLKR_DRTYPE_MULTIIMAGE = 15, /* this record type is not used in the Plucker DB */ PLKR_DRTYPE_NONE = 0xFFFF } plkr_DataRecordType; #define PLKR_FC_CODE(v) (((v)>>3) & 0x1F) typedef enum { PLKR_TFC_LINK = PLKR_FC_CODE (0x0A), /* page or span link start or end */ PLKR_TFC_FONT = PLKR_FC_CODE (0x11), /* set font */ PLKR_TFC_IMAGE = PLKR_FC_CODE (0x1A), /* embedded image */ PLKR_TFC_MARGINS = PLKR_FC_CODE (0x22), /* set left and right margins */ PLKR_TFC_ALIGN = PLKR_FC_CODE (0x29), /* set text alignment */ PLKR_TFC_HRULE = PLKR_FC_CODE (0x33), /* horizontal rule */ PLKR_TFC_NEWLINE = PLKR_FC_CODE (0x38), /* start new line */ PLKR_TFC_BITALIC = PLKR_FC_CODE (0x40), /* begin italic text */ PLKR_TFC_EITALIC = PLKR_FC_CODE (0x48), /* end italic text */ PLKR_TFC_COLOR = PLKR_FC_CODE (0x53), /* set text color */ PLKR_TFC_IMAGE2 = PLKR_FC_CODE (0x5C), /* double embedded image */ PLKR_TFC_BULINE = PLKR_FC_CODE (0x60), /* begin underline text */ PLKR_TFC_EULINE = PLKR_FC_CODE (0x68), /* end underline text */ PLKR_TFC_BSTRIKE = PLKR_FC_CODE (0x70), /* begin struck-through text */ PLKR_TFC_ESTRIKE = PLKR_FC_CODE (0x78), /* end struck-through text */ PLKR_TFC_UCHAR = PLKR_FC_CODE (0x83), /* 16 or 32 bit Unicode character */ PLKR_TFC_GLYPH = PLKR_FC_CODE (0x88), /* glyph run */ PLKR_TFC_TABLE = PLKR_FC_CODE (0x90), /* table data */ } plkr_TextFunctionCodes; typedef enum { PLKR_FONT_REGULAR = 0, PLKR_FONT_H1 = 1, PLKR_FONT_H2 = 2, PLKR_FONT_H3 = 3, PLKR_FONT_H4 = 4, PLKR_FONT_H5 = 5, PLKR_FONT_H6 = 6, PLKR_FONT_REGULARBOLD = 7, PLKR_FONT_FIXEDWIDTH = 8 } plkr_FontStyles; typedef struct _plkr_CategoryName { char *name; struct _plkr_CategoryName *next; } *plkr_CategoryList; typedef struct plkr_Document_s plkr_Document; /* ====================================================================== */ /* A number of functions defined in the library */ /* plkr_OpenDBFile Opens a Plucker document stored as a file indicated by "filename", and returns a document handle. A NULL value is returned if some aspect of the open or parse of the document structure fails. This call consumes a file descriptor, which is held till a subsequent call to plkr_CloseDoc. */ plkr_Document *plkr_OpenDBFile ( char * /* filename */ ); /* plkr_OpenDoc A more general form of open. The caller can pass in a plkr_DBHandle which might provide access to the bytes of the document in an arbitrary way. A NULL value is returned if some aspect of the open or parse of the document structure fails. */ plkr_Document *plkr_OpenDoc ( plkr_DBHandle ); /* plkr_CloseDoc Closes the document and frees all storage associated with it, including cached record data. Invokes the "free" method on the plkr_DBHandle used to open the document. After this call, the plkr_Document pointer is now invalid. */ void plkr_CloseDoc ( plkr_Document * ); /* plkr_CopyRecordBytes Copies the uncompressed bytes of the data of the specified record to the user-provided output buffer, and returns the number of bytes copied. This call does not cache the uncompressed bytes. The type of the record is returned in the "type" parameter. Zero bytes will be copied if the output buffer is too small for the record data. A 64K buffer will always be large enough; a call to plkr_GetMaxRecordSize will return the uncompressed size of the largest record in the document. */ int plkr_CopyRecordBytes ( plkr_Document *, int /* record_index */ , unsigned char * /* output_buffer */ , int /* output_buffer_size */ , plkr_DataRecordType * /* output: type */ ); /* plkr_GetRecordBytes Retrieve a static pointer to a buffer containing the uncompressed data of the specified record. This causes the buffer to be cached by the implementation; do not free() the returned pointer! The size of the buffer is returned through the "size" parameter; the type of the record is returned through the "type" parameter. May return NULL if the "record_index" value is out-of-range. */ unsigned char *plkr_GetRecordBytes ( plkr_Document *, int /* record_index */ , int * /* output: size */ , plkr_DataRecordType * /* output: type */ ); /* plkr_GetRecordURL Retrieve a static pointer to the URL string for the specified record. May return NULL if "record_index" is out-of-range, or if no URLs were included in the document. Fetching the URL for the home page is a good way to test for the latter. */ char *plkr_GetRecordURL ( plkr_Document *, int record_index ); /* plkr_GetHomeRecordID Retrieve the record UID for the 'home' page, the root node of the document. */ int plkr_GetHomeRecordID ( plkr_Document * ); /* plkr_GetName Retrieve a static pointer to the short name of the document. */ char *plkr_GetName ( plkr_Document * ); /* plkr_GetTitle Retrieve a static pointer to the title of the document. Returns NULL if no title was specified. */ char *plkr_GetTitle ( plkr_Document * ); /* plkr_GetAuthor Retrieve a static pointer to the name of the author of the document. Returns NULL if no author was specified. */ char *plkr_GetAuthor ( plkr_Document * ); /* plkr_GetDefaultCharset Returns the IANA mibenum of the default charset used in the document, or 0 if none was specified. */ int plkr_GetDefaultCharset ( plkr_Document * ); /* plkr_GetPublicationTime Returns the time of publication of the document as an unsigned integer. If no explicit publication time was included in the document, returns the creation date, which may be more recent. Time is expressed as seconds past 12:00 am, Jan 1, 1970 -- the UNIX "epoch". */ unsigned long plkr_GetPublicationTime ( plkr_Document * ); /* plkr_GetRecordCount Returns the number of records in the document. */ int plkr_GetRecordCount ( plkr_Document * ); /* plkr_GetMaxRecordSize Returns the uncompressed data size of the largest record in the document. */ int plkr_GetMaxRecordSize ( plkr_Document * ); /* plkr_GetDefaultCategories Retrieve a static GSList of char * values that are the default categories assigned to the document. */ plkr_CategoryList plkr_GetDefaultCategories ( plkr_Document * ); /* plkr_HasRecordWithID Returns 1 if the document has a record with the specified ID, 0 otherwise. */ int plkr_HasRecordWithID ( plkr_Document *, int /* ID */ ); /* plkr_GetRecordType Returns type of record, or PLKR_DRTYPE_NONE if record doesn't exist. */ int plkr_GetRecordType ( plkr_Document *, int /* ID */ ); /* plkr_GetRecordCharset Returns the mibenum of the charset of the record, if the record is a text record, or 0 if the record doesn't exist or is not a text record. */ int plkr_GetRecordCharset ( plkr_Document *, int /* ID */ ); /* plkr_ShowMessages Controls whether or not message display is enabled. Call with 1 for messages to be displayed, 0 for no display. Initial value is 0. Returns previous value. */ int plkr_ShowMessages ( int ); /* plkr_GetConfigString Returns the string value for the option named "option_name" in section named "section_name", if any, or "default_value" if no setting for that name. If "section_name" is NULL, the default section ("default") is used. Section names and option names should be all lowercase. */ char *plkr_GetConfigString ( char *section_name, char *option_name, char *default_value ); /* plkr_GetConfigInt Returns the int value for the option named "option_name" in section named "section_name", if any, or "default_value" if no setting for that name. If "section_name" is NULL, the default section ("default") is used. Section names and option names should be all lowercase. */ long int plkr_GetConfigInt ( char *section_name, char *option_name, long int default_value ); /* plkr_GetConfigFloat Returns the double value for the option named "option_name" in section named "section_name", if any, or "default_value" if no setting for that name. If "section_name" is NULL, the default section ("default") is used. Section names and option names should be all lowercase. */ double plkr_GetConfigFloat ( char *section_name, char *option_name, double default_value ); /* plkr_GetConfigBoolean Returns the boolean value for the option named "option_name" in section named "section_name", if any, or "default_value" if no setting for that name. If "section_name" is NULL, the default section ("default") is used. Section names and option names should be all lowercase. */ int plkr_GetConfigBoolean ( char *section_name, char *option_name, int default_value ); plucker-1.8/tools/unpluck/config.c0100644000076400001440000003045107773642051016313 0ustar mickeusers/* -*- mode: c; indent-tabs-mode: nil; -*- * $Id: config.c,v 1.3 2003/12/28 20:59:21 chrish Exp $ * * config -- read and parse the Plucker config files * Copyright (c) 2002, Bill Janssen * * 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. * */ #if !defined(WIN32) #include /* for lseek, etc. */ #else #include #endif #include #include #include #include #include /* for fstat() */ #include /* for strndup() */ #include /* for errno */ #include /* for O_RDONLY */ #include /* for assert() */ #include "unpluck.h" #include "unpluckint.h" #define STRINGIFY(s) STRINGIFY2 (s) #define STRINGIFY2(s) #s #define MAX_LINE_SIZE 1023 #define COMMENT_CHARS "#;" #define SEGMENT_LEAD_CHAR '[' #define SEGMENT_END_CHAR ']' #define OPTION_SEPARATOR_CHARS "=:" HashTable *SectionsTable = NULL; static HashTable* GetOrCreateSegment ( char* name ) { HashTable* target; if (SectionsTable == NULL) SectionsTable = _plkr_NewHashTable (23); if ((target = _plkr_FindInTable (SectionsTable, name)) == NULL) { target = _plkr_NewHashTable (53); _plkr_AddToTable (SectionsTable, name, target); } return target; } static int ReadConfigFile ( char* filename ) { HashTable* current_segment = NULL; FILE* fp = fopen (filename, "r"); char* ptr; char* str_end; char* str_begin; char* charptr; char* current_option; char* option_value; char linebuf[MAX_LINE_SIZE + 1]; int linelen; int len2; int buf_index; int status; int line_number; if (fp == NULL) { _plkr_message ("Can't open config file %s", filename); return 0; } current_segment = GetOrCreateSegment ("default"); current_option = NULL; status = 1; /* optimistic */ line_number = 0; while (1) { ptr = fgets (linebuf, sizeof (linebuf) - 1, fp); if (ptr == NULL) break; line_number += 1; linebuf[strlen (linebuf) - 1] = 0; /* strip newline */ if (linebuf[strlen (linebuf) - 1] == '\r') linebuf[strlen (linebuf) - 1] = 0; /* strip carriage return */ /* fprintf (stderr, "%s:%d: line is '%s'\n", filename, line_number, linebuf); */ linelen = strlen (linebuf); for (buf_index = 0; linebuf[buf_index] != 0; buf_index++) if (!isspace (linebuf[buf_index])) break; if (linebuf[buf_index] == 0) /* blank line */ continue; if ((strchr (COMMENT_CHARS, linebuf[0]) != NULL) || (strncmp (linebuf, "rem", 3) == 0) || (strncmp (linebuf, "REM", 3) == 0)) /* comment */ continue; /* At this point we have a valid thing */ if (linebuf[buf_index] == SEGMENT_LEAD_CHAR) { if ((str_end = strchr (linebuf + buf_index + 1, SEGMENT_END_CHAR)) == NULL) { /* invalid segment line */ _plkr_message ("%s:%d: Invalid segment line '%s'", filename, line_number, linebuf); goto error_exit; } str_begin = linebuf + buf_index + 1; for (charptr = str_begin; charptr < str_end; charptr++) *charptr = tolower (*charptr); *str_end = 0; current_segment = GetOrCreateSegment (str_begin); /* fprintf (stderr, "Current segment is now %p (%s)\n", current_segment, str_begin); */ if (current_option) free (current_option); current_option = NULL; } else if ((linebuf[0] == ' ' || linebuf[0] == '\t') && current_option != NULL) { /* continuation line */ str_begin = (char *) _plkr_RemoveFromTable (current_segment, current_option); for (str_end = linebuf + strlen (linebuf) - 1; str_end > linebuf && isspace (*str_end); str_end--); charptr = (char *) malloc (strlen (str_begin) + (str_end - (linebuf + buf_index)) + 2); strcpy (charptr, str_begin); len2 = strlen (charptr); charptr[len2] = '\n'; strncpy (charptr + len2 + 1, linebuf + buf_index, str_end - (linebuf + buf_index)); charptr[len2 + (str_end - (linebuf + buf_index)) + 1] = '\0'; _plkr_AddToTable (current_segment, current_option, charptr); free (str_begin); } else if (strcspn (linebuf, OPTION_SEPARATOR_CHARS) < linelen) { /* possible option line */ for (str_begin = linebuf + buf_index, ptr = str_begin; isalnum (*ptr) || (*ptr == '.') || (*ptr == '_') || (*ptr == '-'); ptr++); if (ptr == str_begin) { _plkr_message ("%s:%d: Invalid option line '%s'", filename, line_number, linebuf); goto error_exit; } for (charptr = str_begin; charptr < ptr; charptr++) *charptr = tolower (*charptr); str_end = ptr; while (isspace (*ptr) && (*ptr != '\0')) ptr++; if (strchr (OPTION_SEPARATOR_CHARS, *ptr) != NULL) ptr++; else { _plkr_message ("%s:%d: Invalid option line '%s'", filename, line_number, linebuf); goto error_exit; } while (isspace (*ptr) && (*ptr != '\0')) ptr++; if (*ptr == 0) { _plkr_message ("%s:%d: Invalid option line '%s'", filename, line_number, linebuf); goto error_exit; } if (current_option) free (current_option); current_option = _plkr_strndup (str_begin, str_end - str_begin); option_value = _plkr_strndup (ptr, strlen (ptr)); ptr = (char *) _plkr_RemoveFromTable (current_segment, current_option); if (ptr) free (ptr); _plkr_AddToTable (current_segment, current_option, option_value); /* fprintf (stderr, "Added value '%s' for option '%p:%s'\n", option_value, current_segment, current_option); */ } else { _plkr_message ("%s:%d: Bad line '%s'", filename, line_number, linebuf); goto error_exit; } } good_exit: if (current_option) free (current_option); fclose (fp); return status; error_exit: status = 0; goto good_exit; } static void TryReadConfigFile ( char* dir, char* name ) { char* filename; if (dir == NULL || name == NULL) return; filename = (char *) malloc (strlen (dir) + strlen (name) + 2); strcpy (filename, dir); strcpy (filename + strlen (filename), STRINGIFY (FILE_SEPARATOR_CHAR_S)); strcpy (filename + strlen (filename), name); if (!ReadConfigFile (filename)) _plkr_message ("Error reading config file %s", filename); free (filename); } static void InitializeConfigInfo () { char *config_dir = STRINGIFY (PLUCKER_CONFIG_DIR); char *system_config_file_name = STRINGIFY (SYS_CONFIG_FILE_NAME); char *user_config_filename = STRINGIFY (USER_CONFIG_FILE_NAME); char *home = getenv ("HOME"); TryReadConfigFile (config_dir, system_config_file_name); if (home != NULL) TryReadConfigFile (home, user_config_filename); } char* plkr_GetConfigString ( char* section_name, char* option_name, char* default_value ) { char* value = NULL; HashTable* section; if (SectionsTable == NULL) InitializeConfigInfo (); if (SectionsTable == NULL) return default_value; if (section_name != NULL) { if ((section = (HashTable *) _plkr_FindInTable (SectionsTable, section_name)) != NULL) value = (char *) _plkr_FindInTable (section, option_name); } if (value == NULL && ((section_name == NULL) || (strcmp (section_name, "default") != 0))) { if ((section = (HashTable *) _plkr_FindInTable (SectionsTable, STRINGIFY (OS_SECTION_NAME))) != NULL) value = (char *) _plkr_FindInTable (section, option_name); } if (value == NULL && ((section_name == NULL) || (strcmp (section_name, "default") != 0))) { if ((section = (HashTable *) _plkr_FindInTable (SectionsTable, "default")) != NULL) value = (char *) _plkr_FindInTable (section, option_name); } return ((value == NULL) ? default_value : value); } long int plkr_GetConfigInt ( char* section_name, char* option_name, long int default_value ) { char* svalue = plkr_GetConfigString (section_name, option_name, NULL); char* endptr; long int value; if (svalue == NULL) return default_value; value = strtol (svalue, &endptr, 0); if (*endptr != 0) { _plkr_message ("Bad int value string '%s' for option %s:%s", svalue, (section_name ? section_name : "default"), option_name); return default_value; } else { return value; } } double plkr_GetConfigFloat ( char* section_name, char* option_name, double default_value ) { char* svalue = plkr_GetConfigString (section_name, option_name, NULL); char* endptr; double value; if (svalue == NULL) return default_value; value = strtod (svalue, &endptr); if (*endptr != 0) { _plkr_message ("Bad float value string '%s' for option %s:%s", svalue, (section_name ? section_name : "default"), option_name); return default_value; } else { return value; } } int plkr_GetConfigBoolean ( char* section_name, char* option_name, int default_value ) { char* svalue = plkr_GetConfigString (section_name, option_name, NULL); if (svalue == NULL) return default_value; if ((strcmp (svalue, "1") == 0) || (strcmp (svalue, "true") == 0) || (strcmp (svalue, "TRUE") == 0) || (strcmp (svalue, "on") == 0) || (strcmp (svalue, "ON") == 0) || (strcmp (svalue, "t") == 0) || (strcmp (svalue, "T") == 0) || (strcmp (svalue, "True") == 0)) return 1; else if ((strcmp (svalue, "0") == 0) || (strcmp (svalue, "false") == 0) || (strcmp (svalue, "FALSE") == 0) || (strcmp (svalue, "off") == 0) || (strcmp (svalue, "OFF") == 0) || (strcmp (svalue, "F") == 0) || (strcmp (svalue, "F") == 0) || (strcmp (svalue, "False") == 0)) return 0; else { _plkr_message ("Bad boolean value string '%s' for option %s:%s", svalue, (section_name ? section_name : "default"), option_name); return default_value; } } plucker-1.8/tools/unpluck/Makefile.in0100644000076400001440000000354307713213406016741 0ustar mickeusers# # $Id: Makefile.in,v 1.6 2003/08/03 14:07:02 nordstrom Exp $ # SHELL = @SHELL@ top_builddir = ../.. subdir = tools/unpluck srcdir = @srcdir@ VPATH = @srcdir@ DESTDIR = BINDIR = $(DESTDIR)@bindir@ LIBDIR = $(DESTDIR)@libdir@ DATADIR = $(DESTDIR)@PLUCKERDIR@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ MKINSTALLDIRS = $(top_builddir)/mkinstalldirs TARGET = libunpluck.a RANLIB = @RANLIB@ CC = @CC@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ -DPLUCKER_VERSION="@VERSION@" -DPLUCKER_CONFIG_DIR="@sysconfdir@" -DSYS_CONFIG_FILE_NAME="pluckerrc" -DUSER_CONFIG_FILE_NAME=".pluckerrc" -DFILE_SEPARATOR_CHAR_S="/" -DOS_SECTION_NAME="posix" SOURCES = unpluck.c config.c util.c OBJECTS = ${SOURCES:.c=.o} all: $(TARGET) .c.o: $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $(srcdir)/$*.c Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status $(TARGET): $(OBJECTS) $(AR) r $(TARGET) $(OBJECTS) $(RANLIB) $(TARGET) depend: $(SOURCES) here=`pwd`; cd $(srcdir) && $(CC) -MM $(SOURCES) > $$here/.depend .depend: $(SOURCES) here=`pwd`; cd $(srcdir) && $(CC) -MM $(SOURCES) > $$here/.depend tags: $(SOURCES) *.h here=`pwd`; cd $(srcdir) && $(CTAGS) -o $$here/tags $(SOURCES) *.h install: $(MKINSTALLDIRS) $(LIBDIR) -cp $(TARGET) $(LIBDIR) clean: rm -f *.o core .depend $(TARGET) distclean: clean rm -f Makefile maintainer-clean: distclean @echo "------------------------------------------------------------" @echo "This command is intended for maintainers to use..." @echo "it deletes files that may require special tools to rebuild." @echo "------------------------------------------------------------" plucker-1.8/tools/unpluck/unpluckint.h0100644000076400001440000001176107773642051017252 0ustar mickeusers/* -*- mode: c; indent-tabs-mode: nil; -*- * $Id: unpluckint.h,v 1.5 2003/12/28 20:59:21 chrish Exp $ * * unpluck -- a library to read Plucker data files * Copyright (c) 2002, Bill Janssen * * 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. * */ /* * This header file should be included after an #include of glib.h */ #define PLKR_TIMEADJUST 2082848400 /* difference in seconds between Palm timebase of 12 AM Jan 1, 1904, and UNIX timebase of 12 AM Jan 1, 1970 */ #define MAX_RESERVED 8 #define OWNER_ID_HASH_LEN 40 #ifndef MAX #define MAX(a,b) (((a)>(b))?(a):(b)) #endif #ifndef MIN #define MIN(a,b) (((a)<(b))?(a):(b)) #endif #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif #define READ_BIGENDIAN_SHORT(p) (((p)[0] << 8)|((p)[1])) #define READ_BIGENDIAN_LONG(p) (((p)[0] << 24)|((p)[1] << 16)|((p)[2] << 8)|((p)[3])) typedef enum { PLKR_HOME_NAME = 0, PLKR_URLS_INDEX_NAME = 2, PLKR_DEFAULT_CATEGORY_NAME = 3, PLKR_METADATA_NAME = 4, } ReservedRecordName; typedef struct { int uid; ReservedRecordName name; } ReservedRecordEntry; typedef enum { PLKR_MDTYPE_DEFAULTCHARSET = 1, PLKR_MDTYPE_EXCEPTCHARSETS = 2, PLKR_MDTYPE_OWNERIDCRC = 3, PLKR_MDTYPE_AUTHOR = 4, PLKR_MDTYPE_TITLE = 5, PLKR_MDTYPE_PUBLICATIONTIME = 6, } MetadataTypecodes; typedef enum { PLKR_COMPRESSION_DOC = 1, PLKR_COMPRESSION_ZLIB = 2 } plkr_CompressionType; typedef struct plkr_DataRecord_s plkr_DataRecord; /* A structure to hold information about each record */ struct plkr_DataRecord_s { long offset; int size; /* size in DB */ int uncompressed_size; /* size of compressed portion, when uncompressed */ int cached_size; /* size of cached buffer, if cache is non-NULL */ int uid; int nparagraphs; plkr_DataRecordType type; unsigned char *cache; /* cache of uncompressed full record */ int charset_mibenum; }; /* The main data structure for the document */ struct plkr_Document_s { plkr_DBHandle handle; char *name; /* short name in header */ char *title; /* title in metadata, if any */ char *author; /* author in metadata, if any */ time_t publication_time; /* from metadata, if at all */ time_t creation_time; /* from header */ time_t modification_time; plkr_CompressionType compression; int nrecords; plkr_DataRecord *records; int max_record_size; int home_record_uid; int default_category_record_uid; int metadata_record_uid; int urls_index_record_uid; char **urls; int nurls; plkr_CategoryList default_categories; int default_charset_mibenum; int owner_id_required; /* 1 for yes, 0 for no */ unsigned char owner_id_key[40]; }; /***********************************************************************/ /***********************************************************************/ /***** *****/ /***** Some simple utility routines so we don't need GLib *****/ /***** *****/ /***********************************************************************/ /***********************************************************************/ typedef struct HashTable HashTable; void _plkr_message ( const char *formatSpec, ... ); /* Display the message to stderr */ char *_plkr_strndup ( char *str, int len ); /* return a freshly-malloced copy of str */ HashTable *_plkr_NewHashTable ( int size ); /* create an instance of a string-keyed hash table and return it. "size" is the number of buckets to start with -- should be prime. */ void *_plkr_FindInTable ( HashTable * ht, char *key ); /* lookup the specified "key" in the specified "ht". */ void *_plkr_RemoveFromTable ( HashTable * ht, char *key ); /* remove the entry with "key" from the table, if present, and return the value as the result. */ int _plkr_AddToTable ( HashTable * ht, char *key, void *obj ); /* Add the specified "obj" to the table with key "key". Returns 0 if key is already in table (and doesn't add "obj"), and returns 1 if key was added to table. */ plucker-1.8/tools/unpluck/util.c0100644000076400001440000001652607773642051016032 0ustar mickeusers/* -*- mode: c; indent-tabs-mode: nil; -*- * $Id: util.c,v 1.3 2003/12/28 20:59:21 chrish Exp $ * * util -- Some simple utility routines so we don't need GLib * Copyright (c) 2002, Bill Janssen * * 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. * */ #if !defined(WIN32) #include /* for lseek, etc. */ #else #include #endif #include #include #include /* for _plkr_message */ #include /* for stderr */ #include /* for fstat() */ #include /* for strndup() */ #include /* for errno */ #include /* for O_RDONLY */ #include /* for assert() */ #include #include "unpluck.h" #include "unpluckint.h" /***********************************************************************/ /***********************************************************************/ /***** *****/ /***** Messages *****/ /***** *****/ /***********************************************************************/ /***********************************************************************/ static int ShowMessages = 0; void _plkr_message ( const char* formatSpec, ... ) { va_list ap; va_start (ap, formatSpec); if (ShowMessages) { (void) vfprintf (stderr, formatSpec, ap); fprintf (stderr, "\n"); } va_end (ap); } int plkr_ShowMessages ( int val ) { int oldval = ShowMessages; ShowMessages = val; return oldval; } /***********************************************************************/ /***********************************************************************/ /***** *****/ /***** String Utilities *****/ /***** *****/ /***********************************************************************/ /***********************************************************************/ char* _plkr_strndup ( char* str, int len ) { char* dup; dup = (char *) malloc (len + 1); strncpy (dup, str, len); dup[len] = 0; return dup; } /***********************************************************************/ /***********************************************************************/ /***** *****/ /***** Simple hash table maps string keys to void * values *****/ /***** *****/ /***********************************************************************/ /***********************************************************************/ typedef struct { char* he_key; void* he_data; } HashEntry; typedef struct { int hs_count; int hs_allocated; HashEntry* hs_entries; } HashTableSlot; struct HashTable { int ht_size; int ht_nPairs; HashTableSlot* ht_slots; }; #define HASH_INCREMENT_SIZE 5 #define hashtable_slot(ht,index) (&((ht)->ht_slots[index])) #define hashtable_hash_index(ht,key) (HashString((key), (ht)->ht_size)) #define hashtable_compare_keys(ht,key1,key2) (CompareStrings((key1),(key2))) static int CompareStrings ( char* key1, char* key2 ) { return (strcmp (key1, key2) == 0); } static int HashString ( char* str, int size ) { unsigned long crc; crc = crc32 (0L, NULL, 0); crc = crc32 (crc, str, strlen (str)); return (crc % size); } void* _plkr_FindInTable ( HashTable* ht, char* key ) { HashTableSlot* slot; int count; if (ht == NULL) return (NULL); slot = hashtable_slot (ht, hashtable_hash_index (ht, key)); for (count = slot->hs_count; count > 0; count -= 1) if (hashtable_compare_keys (ht, key, slot->hs_entries[count - 1].he_key)) return (slot->hs_entries[count - 1].he_data); return (NULL); } void* _plkr_RemoveFromTable ( HashTable* ht, char* key ) { HashTableSlot* slot; int count; if (ht == NULL) return (NULL); slot = hashtable_slot (ht, hashtable_hash_index (ht, key)); for (count = 0; count < slot->hs_count; count += 1) if (hashtable_compare_keys (ht, slot->hs_entries[count].he_key, key)) { void *data = slot->hs_entries[count].he_data; free (slot->hs_entries[count].he_key); if ((1 + (unsigned) count) < (unsigned) slot->hs_count) slot->hs_entries[count] = slot->hs_entries[slot->hs_count - 1]; --ht->ht_nPairs; if (--slot->hs_count <= 0) { free (slot->hs_entries); slot->hs_entries = NULL; slot->hs_allocated = 0; slot->hs_count = 0; } return (data); } return (NULL); } int _plkr_AddToTable ( HashTable* ht, char* key, void* obj ) { HashTableSlot* slot; int count; if (ht == NULL) return (0); slot = hashtable_slot (ht, hashtable_hash_index (ht, key)); for (count = slot->hs_count; count > 0; count -= 1) if (hashtable_compare_keys (ht, key, slot->hs_entries[count - 1].he_key)) return (0); if (slot->hs_allocated == 0) { slot->hs_allocated = HASH_INCREMENT_SIZE; slot->hs_entries = (HashEntry *) malloc (sizeof (HashEntry) * slot->hs_allocated); slot->hs_count = 0; } else if (slot->hs_count >= slot->hs_allocated) slot->hs_entries = (HashEntry *) realloc (slot->hs_entries, (slot->hs_allocated += HASH_INCREMENT_SIZE) * sizeof (HashEntry)); slot->hs_entries[slot->hs_count].he_key = _plkr_strndup (key, strlen (key)); slot->hs_entries[slot->hs_count].he_data = obj; slot->hs_count += 1; ht->ht_nPairs += 1; return (1); } HashTable* _plkr_NewHashTable ( int size ) { HashTable *new = (HashTable *) malloc (sizeof (HashTable)); new->ht_size = size; new->ht_nPairs = 0; new->ht_slots = (HashTableSlot *) malloc (sizeof (HashTableSlot) * size); memset ((void *) (new->ht_slots), 0, sizeof (HashTableSlot) * size); return (new); } plucker-1.8/tools/viewer-wxwindows/0040755000076400001440000000000010052665035016560 5ustar mickeusersplucker-1.8/tools/viewer-wxwindows/PluckerHtmlWindow.cpp0100644000076400001440000000530607621473073022716 0ustar mickeusers //typedef unsigned char boolean; //#include "explode.h" extern "C" int explode(char* directory, char* document_path, unsigned char verbose); #include "wx/wxprec.h" #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include #include "PluckerHtmlWindow.h" IMPLEMENT_CLASS(PluckerHtmlWindow, wxFrame) BEGIN_EVENT_TABLE(PluckerHtmlWindow, wxFrame) EVT_MENU(XRCID("file_menu_open"), PluckerHtmlWindow::OnOpen) EVT_MENU(XRCID("file_menu_exit"), PluckerHtmlWindow::OnExit) EVT_MENU(XRCID("navigate_back"), PluckerHtmlWindow::OnNavBack) EVT_MENU(XRCID("navigate_home"), PluckerHtmlWindow::OnNavHome) EVT_MENU(XRCID("navigate_foward"), PluckerHtmlWindow::OnNavForward) END_EVENT_TABLE() PluckerHtmlWindow::PluckerHtmlWindow(wxString title, wxPoint topLeft, wxSize size) : wxFrame(NULL, -1, title, topLeft, size, wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE) { wxInitAllImageHandlers(); wxXmlResource::Get()->InitAllHandlers(); wxXmlResource::Get()->Load("resource/main_menubar.xrc"); wxXmlResource::Get()->Load("resource/main_toolbar.xrc"); SetMenuBar(wxXmlResource::Get()->LoadMenuBar("main_menubar")); SetToolBar(wxXmlResource::Get()->LoadToolBar(this, "main_toolbar")); htmlWindow = new wxHtmlWindow(this); } PluckerHtmlWindow::~PluckerHtmlWindow() { } void PluckerHtmlWindow::LoadPDB(wxString filename) { if (explode((char*) ::wxGetCwd().c_str(), (char*) filename.c_str(), 0) != 0) { htmlWindow->SetPage("There was an error exploding the file"); homeFile = ""; } else { LoadHtml(wxGetCwd() + "/default.html"); } } void PluckerHtmlWindow::LoadHtml(wxString filename) { homeFile = filename; htmlWindow->LoadPage(filename); } void PluckerHtmlWindow::OnOpen(wxCommandEvent &event) { wxFileDialog fileDialog(this); fileDialog.SetWildcard("PDB files (*.pdb)|*.pdb|Html files (*.htm, *.html)|*.htm;*.html"); if (fileDialog.ShowModal() == wxID_OK) { wxString extension = fileDialog.GetFilename().Right(4); if (extension.CmpNoCase(".pdb") == 0) LoadPDB(fileDialog.GetPath()); else LoadHtml(fileDialog.GetPath()); } } void PluckerHtmlWindow::OnExit(wxCommandEvent &event) { Close(); } void PluckerHtmlWindow::OnNavBack(wxCommandEvent &event) { htmlWindow->HistoryBack(); } void PluckerHtmlWindow::OnNavForward(wxCommandEvent &event) { htmlWindow->HistoryForward(); } void PluckerHtmlWindow::OnNavHome(wxCommandEvent &event) { if (homeFile != "") LoadHtml(homeFile); else htmlWindow->SetPage("Home page was invalid"); } plucker-1.8/tools/viewer-wxwindows/resource/0040755000076400001440000000000010052665035020407 5ustar mickeusersplucker-1.8/tools/viewer-wxwindows/resource/undo.bmp0100644000076400001440000000244607621473073022066 0ustar mickeusersBM&6(Ȥplucker-1.8/tools/viewer-wxwindows/resource/main_toolbar.xrc0100644000076400001440000000112007621473073023571 0ustar mickeusers open.bmp undo.bmp home.bmp redo.bmp plucker-1.8/tools/viewer-wxwindows/resource/home.bmp0100644000076400001440000000244607621473073022051 0ustar mickeusersBM&6(Ȥplucker-1.8/tools/viewer-wxwindows/resource/main_menubar.xrc0100644000076400001440000000262407621473073023572 0ustar mickeusers _Open a page _Exit Viewer _Go Back _Go Forward _Go Home plucker-1.8/tools/viewer-wxwindows/resource/open.bmp0100644000076400001440000000036607621473073022061 0ustar mickeusersBMv(33330 333333330 3333  plucker-1.8/tools/viewer-wxwindows/resource/redo.bmp0100644000076400001440000000244607621473073022052 0ustar mickeusersBM&6(Ȥplucker-1.8/tools/viewer-wxwindows/PluckerViewerApp.cpp0100644000076400001440000000117507621473073022524 0ustar mickeusers#include "wx/wxprec.h" #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "PluckerViewerApp.h" #include "PluckerHtmlWindow.h" IMPLEMENT_APP(PluckerViewerApp) PluckerViewerApp::PluckerViewerApp() { } PluckerViewerApp::~PluckerViewerApp() { } bool PluckerViewerApp::OnInit() { PluckerHtmlWindow* frame = new PluckerHtmlWindow(_("Plucker Viewer"), wxPoint(0, 0), wxSize(600, 600)); // frame->LoadHtml("c:/temp/default.html"); // frame->LoadPDB("c:/progra~1/plucker/handhe~1/pluckeruserguide.pdb"); frame->Show(TRUE); SetTopWindow(frame); return true; } int PluckerViewerApp::OnExit(void) { return 0; } plucker-1.8/tools/viewer-wxwindows/dif-for-explode.c.diff0100644000076400001440000000164707621473073022633 0ustar mickeusers4a5 > #if !defined(WIN32) 5a7,38 > #else > //#include > #include > #define mkstemp(a) (_mkdir(a)) > #define __S_IFREG 0100000 > #define __S_IFMT 0170000 > #define __S_IFDIR 0040000 > #define __S_ISTYPE(mode, mask) (((mode) & __S_IFMT) == (mask)) > #define S_ISREG(mode) __S_ISTYPE((mode), __S_IFREG) > #define S_ISDIR(mode) __S_ISTYPE((mode), __S_IFDIR) > void link(char* filename, char* symfilename) > { > FILE *fpw; > FILE *fpr; > fpw = fopen(symfilename, "wb+"); > fpr = fopen(filename, "rb"); > if (fpr && fpw) { > char buffer[1024]; > int count; > while (!feof(fpr)) { > count = fread(buffer, 1, 1024, fpr); > if (count > 0) > fwrite(buffer, 1, count, fpw); > } > } > if (fpr) > fclose(fpr); > if (fpw) > fclose(fpw); > } > #endif > plucker-1.8/tools/viewer-wxwindows/PluckerHtmlWindow.h0100644000076400001440000000130707621473073022360 0ustar mickeusers#if !defined(PLUCKERHTMLWINDOW_H) #define PLUCKERHTMLWINDOW_H #include #include class PluckerHtmlWindow : public wxFrame { DECLARE_CLASS(PluckerHtmlWindow) DECLARE_EVENT_TABLE() public: PluckerHtmlWindow(wxString title, wxPoint topLeft, wxSize size); virtual ~PluckerHtmlWindow(); void LoadHtml(wxString filename); void LoadPDB(wxString filename); void OnOpen(wxCommandEvent &event); void OnExit(wxCommandEvent &event); void OnNavBack(wxCommandEvent &event); void OnNavForward(wxCommandEvent &event); void OnNavHome(wxCommandEvent &event); private: wxHtmlWindow* htmlWindow; wxString filename; wxString homeFile; }; #endif plucker-1.8/tools/viewer-wxwindows/README.txt0100644000076400001440000000050207621473073020257 0ustar mickeusersA simple Plucker viewer for desktop's using a wxWindows GUI Bill Nalen (bill@nalens.com) Copyright 2003 Licensed under the GPL license Uses the explode library /tools/explode to convert the Plucker. PDB into HTML and images, and then reads the HTML inside a HTML window. Currently requires a diff for explode (included)plucker-1.8/tools/viewer-wxwindows/PluckerViewerApp.h0100644000076400001440000000041707621473073022167 0ustar mickeusers#if !defined(PLUCKERVIEWERAPP_H) #define PLUCKERVIEWERAPP_H class PluckerViewerApp : public wxApp { public: PluckerViewerApp(); virtual ~PluckerViewerApp(); virtual bool OnInit(); int OnExit(void); }; DECLARE_APP(PluckerViewerApp) #endif PLUCKERVIEWERAPP_H plucker-1.8/tools/viewer-wxwindows/wxPluckerViewer.dsp0100644000076400001440000001540707621473073022451 0ustar mickeusers# Microsoft Developer Studio Project File - Name="wxPluckerViewer" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=wxPluckerViewer - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "wxPluckerViewer.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "wxPluckerViewer.mak" CFG="wxPluckerViewer - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "wxPluckerViewer - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "wxPluckerViewer - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "wxPluckerViewer - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MD /W3 /GX /O2 /I "c:\wx233\lib\msw" /I "c:\wx233\include" /I "c:\wx233\contrib\include" /I "c:\projects\libjpeg6b\src" /I "c:\projects\pluckerdev\tools\unpluck" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D WINVER=0x400 /D "_MT" /D wxUSE_GUI=1 /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /i "c:\wx233\include" /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib zlib.lib regex.lib png.lib jpeg.lib tiff.lib wxmsw.lib wxxrc.lib unpluck.lib /nologo /subsystem:windows /machine:I386 /libpath:"c:\wx233\lib" /libpath:"c:\wx233\contrib\lib" /libpath:"c:\projects\pluckerdev\tools\unpluck" !ELSEIF "$(CFG)" == "wxPluckerViewer - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "c:\wx233\lib\mswd" /I "c:\wx233\include" /I "c:\wx233\contrib\include" /I "c:\projects\pluckerdev\tools\explode" /I "c:\projects\libjpeg6b\src" /I "c:\projects\pluckerdev\tools\unpluck" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D WINVER=0x400 /D "_MT" /D wxUSE_GUI=1 /D "__WXDEBUG__" /D WXDEBUG=1 /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /i "c:\wx233\include" /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib zlibd.lib regexd.lib pngd.lib jpegd.lib tiffd.lib wxmswd.lib wxxrcd.lib libexploded.lib unpluckd.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"c:\wx233\lib" /libpath:"c:\wx233\contrib\lib" /libpath:"c:\projects\pluckerdev\tools\explode" /libpath:"c:\projects\pluckerdev\tools\unpluck" !ENDIF # Begin Target # Name "wxPluckerViewer - Win32 Release" # Name "wxPluckerViewer - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=.\PluckerHtmlWindow.cpp # End Source File # Begin Source File SOURCE=.\PluckerViewerApp.cpp # End Source File # Begin Source File SOURCE=..\pluckerdev\tools\explode\util.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=.\PluckerHtmlWindow.h # End Source File # Begin Source File SOURCE=.\PluckerViewerApp.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # Begin Source File SOURCE=.\wx\msw\blank.cur # End Source File # Begin Source File SOURCE=.\wx\msw\bullseye.cur # End Source File # Begin Source File SOURCE=.\wx\msw\cdrom.ico # End Source File # Begin Source File SOURCE=.\wx\msw\computer.ico # End Source File # Begin Source File SOURCE=.\wx\msw\drive.ico # End Source File # Begin Source File SOURCE=.\wx\msw\file1.ico # End Source File # Begin Source File SOURCE=.\wx\msw\floppy.ico # End Source File # Begin Source File SOURCE=.\wx\msw\folder1.ico # End Source File # Begin Source File SOURCE=.\wx\msw\folder2.ico # End Source File # Begin Source File SOURCE=.\wx\msw\hand.cur # End Source File # Begin Source File SOURCE=.\wx\msw\magnif1.cur # End Source File # Begin Source File SOURCE=.\wx\msw\noentry.cur # End Source File # Begin Source File SOURCE=.\wx\msw\pbrush.cur # End Source File # Begin Source File SOURCE=.\wx\msw\pencil.cur # End Source File # Begin Source File SOURCE=.\wx\msw\pntleft.cur # End Source File # Begin Source File SOURCE=.\wx\msw\pntright.cur # End Source File # Begin Source File SOURCE=.\wx\msw\query.cur # End Source File # Begin Source File SOURCE=.\wx\msw\removble.ico # End Source File # Begin Source File SOURCE=.\wx\msw\rightarr.cur # End Source File # Begin Source File SOURCE=.\wx\msw\roller.cur # End Source File # Begin Source File SOURCE=.\wx\msw\size.cur # End Source File # Begin Source File SOURCE=.\wx\msw\watch1.cur # End Source File # Begin Source File SOURCE=.\wxPluckerViewer.rc # End Source File # End Group # Begin Source File SOURCE=.\resource\main_menubar.xrc # End Source File # Begin Source File SOURCE=.\resource\main_toolbar.xrc # End Source File # End Target # End Project plucker-1.8/tools/viewer-wxwindows/wxPluckerViewer.dsw0100644000076400001440000000101407621473073022445 0ustar mickeusersMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "wxPluckerViewer"=.\wxPluckerViewer.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### plucker-1.8/tools/conduit-install/0040755000076400001440000000000010052665031016315 5ustar mickeusersplucker-1.8/tools/conduit-install/msw/0040755000076400001440000000000010052674514017131 5ustar mickeusersplucker-1.8/tools/conduit-install/msw/condinst.cpp0100644000076400001440000001340310010044204021431 0ustar mickeusers// condinst.cpp : Defines the entry point for the application. // #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include #include #include #include #include #include #include void ShowUsage() { } std::string FindCLParameter(std::string commandLine, std::string command, std::string def) { int startCmd = commandLine.find(command); if (startCmd == std::string::npos) return def; int endCmd = startCmd + command.size(); int startParam = endCmd + 1; if (startParam > commandLine.size() || commandLine[startParam] == '-') return command; int nextCmd; if (commandLine[startParam] == '"') { ++startParam; nextCmd = commandLine.find('"', startParam); if (nextCmd == std::string::npos) nextCmd = commandLine.size(); } else { nextCmd = commandLine.find('-', startParam); if (nextCmd == std::string::npos) nextCmd = commandLine.size(); else --nextCmd; } if (nextCmd > startParam) return commandLine.substr(startParam, nextCmd - startParam); else return def; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int retval = 0; bool restart = false; bool hotsync_stop = false; if (FindCLParameter(lpCmdLine, "-r", "") == "-r") { restart = true; } bool silent = false; if (FindCLParameter(lpCmdLine, "-s", "") == "-s") { silent = true; } if (FindCLParameter(lpCmdLine, "-u", "") == "-u") { std::string creator = FindCLParameter(lpCmdLine, "-e", ""); if (creator.size() > 0) { HsSetAppStatus(HsCloseApp, HSFLAG_NONE); hotsync_stop = true; if (CmRemoveConduitByCreatorID(creator.c_str()) != 1) { MessageBox(NULL, "Error removing conduit.", "Conduit Installer", 0); retval = 1; } else { if (!silent) { MessageBox(NULL, "Conduit uninstalled.", "Conduit Installer", 0); } retval = 0; } } else { MessageBox(NULL, "Uninstall failed, no creator specified.", "Conduit Installer", 0); retval = 1; } } else if (FindCLParameter(lpCmdLine, "-i", "-i") == "-i") { std::string creator = FindCLParameter(lpCmdLine, "-e", ""); std::string classPath = FindCLParameter(lpCmdLine, "-p", ""); std::string className = FindCLParameter(lpCmdLine, "-l", ""); std::string conduit = FindCLParameter(lpCmdLine, "-c", ""); std::string user = FindCLParameter(lpCmdLine, "-u", ""); std::string info = FindCLParameter(lpCmdLine, "-i", ""); std::string condName = FindCLParameter(lpCmdLine, "-n", "Conduit"); std::string file = FindCLParameter(lpCmdLine, "-f", "file"); std::string title = FindCLParameter(lpCmdLine, "-t", "Conduit"); std::string directory = FindCLParameter(lpCmdLine, "-d", "dir"); std::string remoteDB = FindCLParameter(lpCmdLine, "-b", "remoteDB"); int priority = 2; if ((className.size() > 0 || classPath.size() > 0) && conduit.size() == 0) conduit = "jsync13.dll"; if (creator.size() > 0 && conduit.size() > 0) { HsSetAppStatus(HsCloseApp, HSFLAG_NONE); hotsync_stop = true; int err = CmInstallCreator(creator.c_str(), CONDUIT_APPLICATION); if (err != 0) { if (err == ERR_CREATORID_ALREADY_IN_USE) { err = 0; } else { MessageBox(NULL, "Error installing conduit.", "Conduit Installer", 0); retval = 1; } } if (err == 0) { err = CmSetCreatorName(creator.c_str(), conduit.c_str()); if (directory.size() > 0) err = CmSetCreatorDirectory(creator.c_str(), directory.c_str()); if (file.size() > 0) err = CmSetCreatorFile(creator.c_str(), file.c_str()); if (remoteDB.size() > 0) err = CmSetCreatorRemote(creator.c_str(), remoteDB.c_str()); if (title.size() > 0) err = CmSetCreatorTitle(creator.c_str(), title.c_str()); if (user.size() > 0) err = CmSetCreatorUser(creator.c_str(), user.c_str()); if (priority >= 0 && priority <= 4) err = CmSetCreatorPriority(creator.c_str(), priority); if (info.size() > 0) err = CmSetCreatorInfo(creator.c_str(), info.c_str()); if (className.size() > 0) err = CmSetCreatorValueString(creator.c_str(), "ClassName", (char*) className.c_str()); if (classPath.size() > 0) err = CmSetCreatorValueString(creator.c_str(), "ClassPath13", (char*) classPath.c_str()); int numUsers = UmGetUserCount(); unsigned long creatorID; CmConvertStringToCreatorID(creator.c_str(), &creatorID); for (int i = 0; i < numUsers; i++) { unsigned long userID; UmGetUserID(i, &userID); UmSetUserPermSyncPreferences(userID, creatorID, PCToHH); UmSetUserTempSyncPreferences(userID, creatorID, PCToHH); } } if (!silent) { MessageBox(NULL, "Conduit installed.", "Conduit Installer", 0); } } else { MessageBox(NULL, "Error installing conduit. No creator or conduit supplied.", "Conduit Installer", 0); retval = 1; } } if (hotsync_stop && restart) { HsSetAppStatus(HsStartApp, HSFLAG_NONE); } return retval; } plucker-1.8/tools/conduit-install/msw/condinst.dsp0100644000076400001440000001032207775657444021502 0ustar mickeusers# Microsoft Developer Studio Project File - Name="condinst" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=condinst - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "condinst.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "condinst.mak" CFG="condinst - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "condinst - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "condinst - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "condinst - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /c # ADD CPP /nologo /W3 /GX /O2 /I "D:\cdk403\c++\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib condmgr.lib userdata.lib hsapi.lib Instaide.lib /nologo /subsystem:windows /machine:I386 /libpath:"D:\cdk403\c++\lib" # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "condinst - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "D:\cdk403\c++\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib condmgr.lib userdata.lib hsapi.lib Instaide.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"D:\cdk403\c++\lib" # SUBTRACT LINK32 /pdb:none !ENDIF # Begin Target # Name "condinst - Win32 Release" # Name "condinst - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=.\condinst.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # Begin Source File SOURCE=.\changelog.condinst.txt # End Source File # Begin Source File SOURCE=.\readme.condinst.txt # End Source File # End Target # End Project plucker-1.8/tools/conduit-install/msw/condinst.dsw0100644000076400001440000000077607774442271021512 0ustar mickeusersMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "condinst"=.\condinst.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### plucker-1.8/tools/conduit-install/msw/readme.condinst.txt0100644000076400001440000000264210010044204022725 0ustar mickeusers A general purpose conduit installer for Windows Bill Nalen (bill@nalens.com) Copyright 2003 Licensed under the GPL license (see copy of enclosed COPYING file for details) This program will install a conduit for the Palm. See the Hotsync developer documentation for more details. The command line arguments are all one letter long, to maximize the amount of arguments that can be fit into the anemic Win32 Commandline space: -i install: Install the conduit requires the creator and conduit options or -u uninstall: Uninstall the conduit requires only the creator option -c conduit: path & filename of conduit -e creator: creator id for the application to sync with -p cp: classpath for Java conduits -l class: main class for Java conduits -u user: user entry -i info: info entry -n name: name of conduit -f file: local file name -t title: title of conduit -d dir: local directory -b remoteDB: remote file name -r restarthotsync: restart hotsync manager upon exit -s silentifnoerror: don't display messages if no errors Example usage to install a conduit: condinst.exe -i -r Plkr -c "C:\Program Files\Plucker\conduit_install\pluckercond.dll" -t "Plucker" -r -s Example usage to uninstall condinst.exe -u -r Plkr plucker-1.8/tools/conduit-install/msw/changelog.condinst.txt0100644000076400001440000000037210010044204023415 0ustar mickeusers0.1.2 - added one letter shortforms, to maximize the info that can be used with the limited length of the win32 commandline 0.1.1 - added -restarthotsync option added -silentifnoerror option 0.1.0 - January 31, 2003 Initial Releaseplucker-1.8/tools/conduit-install/msw/COPYRIGHT0100644000076400001440000003644007774442271020442 0ustar mickeusersThe code in the GKrellM distribution is Copyright 1999-2003 by Bill Wilson except for: md5global.h, base64.c which are Copyright 1997 by Eric S. Raymond and are under GPL version 2. and md5.h, md5c.c which are public domain. All code in the GKrellM distribution which is Copyright Bill Wilson or which references this COPYRIGHT file is licensed under the GPL version 2 included below. ------------------------------------------------------------------------------- GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, 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. ------------------------------------------------------------------------------- plucker-1.8/README0100644000076400001440000000161307715462110012727 0ustar mickeusersPlucker increases the utility of your hand-held device by letting you view web pages and any document that can be converted to HTML or text. Plucker has many advanced features including the ability to read web pages with embedded images, an advanced find function, the ability to open an e-mail form when tapping on mail-links in web documents, an impressive compression ratio for the documents and an open, documented DB format. It can also be customized for your specific needs. And not to be forgotten - the source code is available for your perusal. It is free under the terms of the GNU General Public License, Version 2 (or any later version you might like to use) - see the file COPYING for copyright details. For more information see the main web site, http://www.plkr.org/ As always we would love to hear your success (or failure) stories: send them to plucker-team@rubberchicken.org. plucker-1.8/configure0100755000076400001440000053303010052675417013765 0ustar mickeusers#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.57. # # Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 # Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi # Support unset when possible. if (FOO=FOO; unset FOO) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" # Sed expression to map a string onto a valid variable name. as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` exec 6>&1 # # Initializations. # ac_default_prefix=/usr/local ac_config_libobj_dir=. cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. # This variable seems obsolete. It should probably be removed, and # only ac_max_sed_lines should be used. : ${ac_max_here_lines=38} # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= ac_unique_file="unix/install-plucker" ac_subdirs_all="$ac_subdirs_all viewer" # Factoring default headers for most tests. ac_includes_default="\ #include #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if STDC_HEADERS # include # include #else # if HAVE_STDLIB_H # include # endif #endif #if HAVE_STRING_H # if !STDC_HEADERS && HAVE_MEMORY_H # include # endif # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_INTTYPES_H # include #else # if HAVE_STDINT_H # include # endif #endif #if HAVE_UNISTD_H # include #endif" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS PACKAGE VERSION RANLIB ac_ct_RANLIB INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA PYTHON PYTHON_LIBDIR JAVA JAVAC JYTHON JYTHONC JAR JAVA_DISTILLER_TARGET JAVA_HOME JAVA_CLASSPATH PNMTOPALM PPMQUANT PPMTOTBMP MOGRIFY IMAGEHACKING AUTOCONF MODULE_DIR PLUCKERDIR COMICS_DIR COMICSLIST_DIR DOCDIR NLSDIR SED LATEX L2H GIFTOPNM PNMTOPS BUILD_MANUAL subdirs BUILD_PRC CXX CXXFLAGS LDFLAGS CPPFLAGS ac_ct_CXX EXEEXT OBJEXT BUILD_DESKTOP CC CFLAGS ac_ct_CC CPP EGREP AT_PROG RM_PROG NETSCAPE_PROG BUILD_UNPLUCK BUILD_EXPLODE BUILD_GTKVIEWER GTK2INCLUDES GTK2LIBS PKG_CONFIG LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_option in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` eval "enable_$ac_feature=no" ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "enable_$ac_feature='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package| sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "with_$ac_package='$ac_optarg'" ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/-/_/g'` eval "with_$ac_package=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` eval "$ac_envvar='$ac_optarg'" export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute paths. for ac_var in exec_prefix prefix do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* | NONE | '' ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_confdir=`(dirname "$0") 2>/dev/null || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 { (exit 1); exit 1; }; } else { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi fi (cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 { (exit 1); exit 1; }; } srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` ac_env_build_alias_set=${build_alias+set} ac_env_build_alias_value=$build_alias ac_cv_env_build_alias_set=${build_alias+set} ac_cv_env_build_alias_value=$build_alias ac_env_host_alias_set=${host_alias+set} ac_env_host_alias_value=$host_alias ac_cv_env_host_alias_set=${host_alias+set} ac_cv_env_host_alias_value=$host_alias ac_env_target_alias_set=${target_alias+set} ac_env_target_alias_value=$target_alias ac_cv_env_target_alias_set=${target_alias+set} ac_cv_env_target_alias_value=$target_alias ac_env_CXX_set=${CXX+set} ac_env_CXX_value=$CXX ac_cv_env_CXX_set=${CXX+set} ac_cv_env_CXX_value=$CXX ac_env_CXXFLAGS_set=${CXXFLAGS+set} ac_env_CXXFLAGS_value=$CXXFLAGS ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} ac_cv_env_CXXFLAGS_value=$CXXFLAGS ac_env_LDFLAGS_set=${LDFLAGS+set} ac_env_LDFLAGS_value=$LDFLAGS ac_cv_env_LDFLAGS_set=${LDFLAGS+set} ac_cv_env_LDFLAGS_value=$LDFLAGS ac_env_CPPFLAGS_set=${CPPFLAGS+set} ac_env_CPPFLAGS_value=$CPPFLAGS ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} ac_cv_env_CPPFLAGS_value=$CPPFLAGS ac_env_CC_set=${CC+set} ac_env_CC_value=$CC ac_cv_env_CC_set=${CC+set} ac_cv_env_CC_value=$CC ac_env_CFLAGS_set=${CFLAGS+set} ac_env_CFLAGS_value=$CFLAGS ac_cv_env_CFLAGS_set=${CFLAGS+set} ac_cv_env_CFLAGS_value=$CFLAGS ac_env_CPP_set=${CPP+set} ac_env_CPP_value=$CPP ac_cv_env_CPP_set=${CPP+set} ac_cv_env_CPP_value=$CPP # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] _ACEOF cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data [PREFIX/share] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --infodir=DIR info documentation [PREFIX/info] --mandir=DIR man documentation [PREFIX/man] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-java-distiller build the Java version of the distiller yes --disable-docbuild don't build the documentation --disable-palmosbuild don't build the viewer application --enable-category=CATEGORY set the default launcher category --enable-armlets to enable arm-specific code --enable-wait-icon=ICON set the wait indicator to ICON (thought-bubble or hourglass) --enable-errorchecklevel=LEVEL set the ERROR_CHECK_LEVEL to LEVEL (none, partial, or full) --enable-gesture-debug include Graffiti indicator to debug the gestures feature --enable-debug-log include macros writing debug info to log file when running viewer in POSE and to memo when running it on a real device --enable-debug-labels include each function's name into the text section to get the function names included in POSE's profiling output --enable-imode to enable i-mode support (also requires the imodeicons.pdb database) --disable-scroll-to-bottom always scroll even pages instead of stopping when the end of the page is reached (will add some extra whitespace at the bottom of the page) --disable-hires to disable hires-specific code --disable-rotate to disable display rotation --disable-palm-dia to disable Palm DIA support --disable-anti-alias to disable anti-aliased font code --disable-vfs-fonts to disable user fonts on VFS code --enable-word-lookup to enable word lookup support --disable-transliteration to disable search transliteration --enable-skins to enable skins support --enable-returntoapp to enable return to previous app on exit --disable-desktopbuild don't build the GUI desktop tool --disable-unpluck don't build the unpluck library --disable-explode don't build the explode program --disable-gtkviewer don't build the GTK+2 viewer Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-classpath=CLASSPATH --with-pypluckerdir=PATH specify where the Python parser should go PYTHON_LIBDIR/site-packages/PyPlucker --with-pluckerdir=PATH specify where the Plucker data should go DATADIR/plucker --with-comicsdir=PATH specify where pluck-comics should put the downloaded comics /var/spool/netcomics --with-docdir=PATH specify where the Plucker documentation should go PLUCKERDIR/doc --with-nlsdir=PATH specify where the locale stuff should go DATADIR/locale --with-lang=LANG build viewers translated to the given languages --with-handera=DIR use the Handera SDK in DIR --with-handspring=DIR use the Handspring SDK in DIR --with-sony=DIR use the Sony SDK in DIR --with-sonysilk=DIR path to Sony Silkscreen SDK (specifically, SonySlkw.h) --with-fiveway=DIR path to FiveWay SDK (specifically, PalmChars.h) --with-axxpac=DIR use the axxPac.h header file in DIR --with-palmcunit=DIR path to PalmCUnit Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. _ACEOF fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d $ac_dir || continue ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be # absolute. ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` cd $ac_dir # Check for guested configure; otherwise get Cygnus style configure. if test -f $ac_srcdir/configure.gnu; then echo $SHELL $ac_srcdir/configure.gnu --help=recursive elif test -f $ac_srcdir/configure; then echo $SHELL $ac_srcdir/configure --help=recursive elif test -f $ac_srcdir/configure.ac || test -f $ac_srcdir/configure.in; then echo $ac_configure --help else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi cd $ac_popdir done fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit 0 fi exec 5>config.log cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.57. Invocation command line was $ $0 $@ _ACEOF { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` hostinfo = `(hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_sep= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" # Get rid of the leading space. ac_sep=" " ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Be sure not to use single quotes in there, as some shells, # such as our DU 5.0 friend, will then `close' the trap. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, { (set) 2>&1 | case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------- ## ## Output files. ## ## ------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo sed "/^$/d" confdefs.h | sort echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core core.* *.core && rm -rf conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo >confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . $cache_file;; *) . ./$cache_file;; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in `(set) 2>&1 | sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val="\$ac_cv_env_${ac_var}_value" eval ac_new_val="\$ac_env_${ac_var}_value" case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu PACKAGE=plucker VERSION="1.8" if test "X${prefix}" = "XNONE"; then prefix=/usr/local fi if test "X${exec_prefix}" = "XNONE"; then exec_prefix=$prefix fi bindir=`eval echo $bindir` libdir=`eval echo $libdir` datadir=`eval echo $datadir` sysconfdir=`eval echo $sysconfdir` BUILD_MANUAL=yes BUILD_DESKTOP=yes BUILD_GTKVIEWER=yes OUTPUT_FILES="Makefile unix/setup.py parser/Makefile parser/python/Makefile parser/python/PyPlucker/Makefile parser/python/PyPlucker/__init__.py docs/Makefile tools/Makefile tools/pluck-comics/Makefile tools/pluck-comics/pluck-comics.py viewer-GTK+2-POSIX/Makefile" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then echo "$as_me:$LINENO: result: $RANLIB" >&5 echo "${ECHO_T}$RANLIB" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 echo "${ECHO_T}$ac_ct_RANLIB" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi RANLIB=$ac_ct_RANLIB else RANLIB="$ac_cv_prog_RANLIB" fi ac_aux_dir= for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f $ac_dir/install.sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f $ac_dir/shtool; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} { (exit 1); exit 1; }; } fi ac_config_guess="$SHELL $ac_aux_dir/config.guess" ac_config_sub="$SHELL $ac_aux_dir/config.sub" ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL=$ac_install_sh fi fi echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' # Extract the first word of "python", so it can be a program name with args. set dummy python; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_PYTHON+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $PYTHON in [\\/]* | ?:[\\/]*) ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi PYTHON=$ac_cv_path_PYTHON if test -n "$PYTHON"; then echo "$as_me:$LINENO: result: $PYTHON" >&5 echo "${ECHO_T}$PYTHON" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test "X$PYTHON" = "X"; then { { echo "$as_me:$LINENO: error: \"Unable to find python\"" >&5 echo "$as_me: error: \"Unable to find python\"" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: checking \"Python version\"" >&5 echo $ECHO_N "checking \"Python version\"... $ECHO_C" >&6 PYTHON_MAJOR_LIBVER=`$PYTHON -c "\ import sys, string print string.splitfields(string.splitfields(sys.version, ' ')[0], '.')[0]"` PYTHON_MINOR_LIBVER=`$PYTHON -c "\ import sys, string print string.splitfields(string.splitfields(sys.version, ' ')[0], '.')[1]"` PYTHON_MINOR_MINOR_VER=`$PYTHON -c "\ import sys, string fields = string.splitfields(string.splitfields(sys.version, ' ')[0], '.') if (len(fields) > 2) and (fields[2][0] in '0123456789'): print fields[2][0] else: print '0'"` echo "$as_me:$LINENO: result: \"$PYTHON_MAJOR_LIBVER.$PYTHON_MINOR_LIBVER.$PYTHON_MINOR_MINOR_VER\"" >&5 echo "${ECHO_T}\"$PYTHON_MAJOR_LIBVER.$PYTHON_MINOR_LIBVER.$PYTHON_MINOR_MINOR_VER\"" >&6 if test $PYTHON_MAJOR_LIBVER -gt 1 -o $PYTHON_MINOR_LIBVER -gt 5 -o \( $PYTHON_MINOR_LIBVER -eq 5 -a $PYTHON_MINOR_MINOR_VER -ge 2 \); then PYTHON_LIBDIR=`$PYTHON -c "import sys, os; print os.path.join(os.path.join(sys.prefix, 'lib'),'python%s.%s' % ($PYTHON_MAJOR_LIBVER, $PYTHON_MINOR_LIBVER))"` else { { echo "$as_me:$LINENO: error: \"Python version too low -- at least 1.5.2 is required.\"" >&5 echo "$as_me: error: \"Python version too low -- at least 1.5.2 is required.\"" >&2;} { (exit 1); exit 1; }; } fi # Check whether --enable-java-distiller or --disable-java-distiller was given. if test "${enable_java_distiller+set}" = set; then enableval="$enable_java_distiller" build_java_distiller=$enableval else build_java_distiller=yes fi; JAVA_DISTILLER_TARGET= JAVA_HOME= : ${CLASSPATH=.} if test "$build_java_distiller" = "no" ; then echo "$as_me:$LINENO: result: Java distiller will not be built, by request" >&5 echo "${ECHO_T}Java distiller will not be built, by request" >&6 else # Check whether --with-classpath or --without-classpath was given. if test "${with_classpath+set}" = set; then withval="$with_classpath" JAVA_CLASSPATH=$with_classpath else JAVA_CLASSPATH=$CLASSPATH fi; # Extract the first word of "java", so it can be a program name with args. set dummy java; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_JAVA+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $JAVA in [\\/]* | ?:[\\/]*) ac_cv_path_JAVA="$JAVA" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_JAVA="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi JAVA=$ac_cv_path_JAVA if test -n "$JAVA"; then echo "$as_me:$LINENO: result: $JAVA" >&5 echo "${ECHO_T}$JAVA" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi # Extract the first word of "javac", so it can be a program name with args. set dummy javac; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_JAVAC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $JAVAC in [\\/]* | ?:[\\/]*) ac_cv_path_JAVAC="$JAVAC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_JAVAC="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi JAVAC=$ac_cv_path_JAVAC if test -n "$JAVAC"; then echo "$as_me:$LINENO: result: $JAVAC" >&5 echo "${ECHO_T}$JAVAC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi # Extract the first word of "jython", so it can be a program name with args. set dummy jython; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_JYTHON+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $JYTHON in [\\/]* | ?:[\\/]*) ac_cv_path_JYTHON="$JYTHON" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_JYTHON="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi JYTHON=$ac_cv_path_JYTHON if test -n "$JYTHON"; then echo "$as_me:$LINENO: result: $JYTHON" >&5 echo "${ECHO_T}$JYTHON" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi # Extract the first word of "jythonc", so it can be a program name with args. set dummy jythonc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_JYTHONC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $JYTHONC in [\\/]* | ?:[\\/]*) ac_cv_path_JYTHONC="$JYTHONC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_JYTHONC="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi JYTHONC=$ac_cv_path_JYTHONC if test -n "$JYTHONC"; then echo "$as_me:$LINENO: result: $JYTHONC" >&5 echo "${ECHO_T}$JYTHONC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi # Extract the first word of "jar", so it can be a program name with args. set dummy jar; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_JAR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $JAR in [\\/]* | ?:[\\/]*) ac_cv_path_JAR="$JAR" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_JAR="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi JAR=$ac_cv_path_JAR if test -n "$JAR"; then echo "$as_me:$LINENO: result: $JAR" >&5 echo "${ECHO_T}$JAR" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test "x$JAVA" = "x" -o "x$JAVAC" = "x" -o "x$JYTHON" = "x" -o "x$JYTHONC" = "x" -o "x$JAR" = "x" ; then echo "$as_me:$LINENO: result: Java and/or Jython not available" >&5 echo "${ECHO_T}Java and/or Jython not available" >&6 else # test for JIU with PalmCodec support if test "x$JAVA_CLASSPATH" = x ; then echo "$as_me:$LINENO: result: Using empty CLASSPATH" >&5 echo "${ECHO_T}Using empty CLASSPATH" >&6 else echo "$as_me:$LINENO: result: Using CLASSPATH of $JAVA_CLASSPATH" >&5 echo "${ECHO_T}Using CLASSPATH of $JAVA_CLASSPATH" >&6 fi echo "$as_me:$LINENO: checking for Java Imaging Utilities with Palm support" >&5 echo $ECHO_N "checking for Java Imaging Utilities with Palm support... $ECHO_C" >&6 CLASSPATH=$JAVA_CLASSPATH $JYTHON - </tmp/jiu-test.$$ 2>/dev/null import sys try: import net.sourceforge.jiu.codecs if 'PalmCodec' in dir(net.sourceforge.jiu.codecs): sys.stdout.write('1\n') else: sys.stdout.write('0\n') except: sys.stdout.write('0\n') EOF jiutest=`cat /tmp/jiu-test.$$` if test "$jiutest" = "1"; then echo "$as_me:$LINENO: result: available" >&5 echo "${ECHO_T}available" >&6 JAVA_DISTILLER_TARGET=plucker-build.jar # Apple insists you use /Library/Java/Home for their JAVAHOME, so check for that if test -d /Library/Java/Home ; then JAVA_HOME="/Library/Java/Home" else JAVA_HOME="`$JYTHON -c \"import java; print java.lang.System.getProperty('java.home')\"`" fi else echo "$as_me:$LINENO: result: not available" >&5 echo "${ECHO_T}not available" >&6 fi rm -rf /tmp/jiu-test.$$ fi fi # Extract the first word of "pnmtopalm", so it can be a program name with args. set dummy pnmtopalm; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_PNMTOPALM+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $PNMTOPALM in [\\/]* | ?:[\\/]*) ac_cv_path_PNMTOPALM="$PNMTOPALM" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PNMTOPALM="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi PNMTOPALM=$ac_cv_path_PNMTOPALM if test -n "$PNMTOPALM"; then echo "$as_me:$LINENO: result: $PNMTOPALM" >&5 echo "${ECHO_T}$PNMTOPALM" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi # Extract the first word of "ppmquant", so it can be a program name with args. set dummy ppmquant; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_PPMQUANT+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $PPMQUANT in [\\/]* | ?:[\\/]*) ac_cv_path_PPMQUANT="$PPMQUANT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PPMQUANT="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi PPMQUANT=$ac_cv_path_PPMQUANT if test -n "$PPMQUANT"; then echo "$as_me:$LINENO: result: $PPMQUANT" >&5 echo "${ECHO_T}$PPMQUANT" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi # Extract the first word of "ppmtoTbmp", so it can be a program name with args. set dummy ppmtoTbmp; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_PPMTOTBMP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $PPMTOTBMP in [\\/]* | ?:[\\/]*) ac_cv_path_PPMTOTBMP="$PPMTOTBMP" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PPMTOTBMP="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi PPMTOTBMP=$ac_cv_path_PPMTOTBMP if test -n "$PPMTOTBMP"; then echo "$as_me:$LINENO: result: $PPMTOTBMP" >&5 echo "${ECHO_T}$PPMTOTBMP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi # Extract the first word of "mogrify", so it can be a program name with args. set dummy mogrify; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_MOGRIFY+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $MOGRIFY in [\\/]* | ?:[\\/]*) ac_cv_path_MOGRIFY="$MOGRIFY" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MOGRIFY="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi MOGRIFY=$ac_cv_path_MOGRIFY if test -n "$MOGRIFY"; then echo "$as_me:$LINENO: result: $MOGRIFY" >&5 echo "${ECHO_T}$MOGRIFY" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi echo "$as_me:$LINENO: checking \"for PIL\"" >&5 echo $ECHO_N "checking \"for PIL\"... $ECHO_C" >&6 $PYTHON -c 'import Image' >/dev/null 2>&1 if test $? = "0"; then HAS_PIL=yes else HAS_PIL=no fi echo "$as_me:$LINENO: result: $HAS_PIL" >&5 echo "${ECHO_T}$HAS_PIL" >&6 echo "$as_me:$LINENO: checking \"what to use for image transformation\"" >&5 echo $ECHO_N "checking \"what to use for image transformation\"... $ECHO_C" >&6 IMAGEHACKING="" if test "X$PNMTOPALM" != "X" ; then if test "X$PPMQUANT" != "X" ; then IMAGEHACKING="netpbm2" fi elif test "$HAS_PIL" = "yes" ; then IMAGEHACKING="pil2" elif test "X$PPMTOTBMP" != "X" ; then if test "X$PPMQUANT" != "X" ; then IMAGEHACKING="netpbm" elif test "X$MOGRIFY" != "X" ; then IMAGEHACKING="imagemagick" fi fi if test "X$IMAGEHACKING" = "X" ; then echo "$as_me:$LINENO: result: \"nothing available\"" >&5 echo "${ECHO_T}\"nothing available\"" >&6 else echo "$as_me:$LINENO: result: $IMAGEHACKING" >&5 echo "${ECHO_T}$IMAGEHACKING" >&6 fi # Extract the first word of "autoconf", so it can be a program name with args. set dummy autoconf; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_AUTOCONF+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $AUTOCONF in [\\/]* | ?:[\\/]*) ac_cv_path_AUTOCONF="$AUTOCONF" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_AUTOCONF="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_path_AUTOCONF" && ac_cv_path_AUTOCONF="autoconf" ;; esac fi AUTOCONF=$ac_cv_path_AUTOCONF if test -n "$AUTOCONF"; then echo "$as_me:$LINENO: result: $AUTOCONF" >&5 echo "${ECHO_T}$AUTOCONF" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi # Check whether --with-pypluckerdir or --without-pypluckerdir was given. if test "${with_pypluckerdir+set}" = set; then withval="$with_pypluckerdir" fi; if test "X$with_pypluckerdir" != "X"; then MODULE_DIR=$with_pypluckerdir else MODULE_DIR="$PYTHON_LIBDIR/site-packages/PyPlucker" fi # Check whether --with-pluckerdir or --without-pluckerdir was given. if test "${with_pluckerdir+set}" = set; then withval="$with_pluckerdir" fi; if test "X$with_pluckerdir" != "X"; then PLUCKERDIR=$with_pluckerdir else PLUCKERDIR=$datadir/plucker fi # Check whether --with-comicsdir or --without-comicsdir was given. if test "${with_comicsdir+set}" = set; then withval="$with_comicsdir" fi; if test "X$with_comicsdir" != "X"; then COMICS_DIR=$with_comicsdir else COMICS_DIR=/var/spool/netcomics fi COMICSLIST_DIR=$PLUCKERDIR/comics # Check whether --with-docdir or --without-docdir was given. if test "${with_docdir+set}" = set; then withval="$with_docdir" fi; if test "X$DOCDIR" = "X"; then if test "X$with_docdir" != "X"; then DOCDIR=$with_docdir else DOCDIR=$PLUCKERDIR/doc fi fi # Check whether --with-nlsdir or --without-nlsdir was given. if test "${with_nlsdir+set}" = set; then withval="$with_nlsdir" fi; if test "X$NLSDIR" = "X"; then if test "X$with_nlsdir" != "X"; then NLSDIR=$with_nlsdir else NLSDIR=$datadir/locale fi fi # Check whether --enable-docbuild or --disable-docbuild was given. if test "${enable_docbuild+set}" = set; then enableval="$enable_docbuild" BUILD_MANUAL=no fi; if test "$BUILD_MANUAL" = "yes"; then for ac_prog in gsed sed do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_SED+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $SED in [\\/]* | ?:[\\/]*) ac_cv_path_SED="$SED" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_SED="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi SED=$ac_cv_path_SED if test -n "$SED"; then echo "$as_me:$LINENO: result: $SED" >&5 echo "${ECHO_T}$SED" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$SED" && break done $SED --version 2>&1 < /dev/null | grep GNU >/dev/null 2>&1 if test "$?" != "0" ; then { echo "$as_me:$LINENO: WARNING: \"Version of sed on path must be GNU sed to build manual\"" >&5 echo "$as_me: WARNING: \"Version of sed on path must be GNU sed to build manual\"" >&2;} BUILD_MANUAL=no fi # Extract the first word of "latex", so it can be a program name with args. set dummy latex; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_LATEX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $LATEX in [\\/]* | ?:[\\/]*) ac_cv_path_LATEX="$LATEX" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_LATEX="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi LATEX=$ac_cv_path_LATEX if test -n "$LATEX"; then echo "$as_me:$LINENO: result: $LATEX" >&5 echo "${ECHO_T}$LATEX" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test "X$LATEX" = "X"; then { echo "$as_me:$LINENO: WARNING: \"Unable to find latex\"" >&5 echo "$as_me: WARNING: \"Unable to find latex\"" >&2;} BUILD_MANUAL=no fi # Extract the first word of "latex2html", so it can be a program name with args. set dummy latex2html; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_L2H+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $L2H in [\\/]* | ?:[\\/]*) ac_cv_path_L2H="$L2H" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_L2H="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi L2H=$ac_cv_path_L2H if test -n "$L2H"; then echo "$as_me:$LINENO: result: $L2H" >&5 echo "${ECHO_T}$L2H" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test "X$L2H" = "X"; then { echo "$as_me:$LINENO: WARNING: \"Unable to find latex2html\"" >&5 echo "$as_me: WARNING: \"Unable to find latex2html\"" >&2;} BUILD_MANUAL=no fi # Extract the first word of "giftopnm", so it can be a program name with args. set dummy giftopnm; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_GIFTOPNM+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $GIFTOPNM in [\\/]* | ?:[\\/]*) ac_cv_path_GIFTOPNM="$GIFTOPNM" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GIFTOPNM="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi GIFTOPNM=$ac_cv_path_GIFTOPNM if test -n "$GIFTOPNM"; then echo "$as_me:$LINENO: result: $GIFTOPNM" >&5 echo "${ECHO_T}$GIFTOPNM" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test "X$GIFTOPNM" = "X"; then { echo "$as_me:$LINENO: WARNING: \"Unable to find giftopnm from netpbm\"" >&5 echo "$as_me: WARNING: \"Unable to find giftopnm from netpbm\"" >&2;} BUILD_MANUAL=no fi # Extract the first word of "pnmtops", so it can be a program name with args. set dummy pnmtops; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_PNMTOPS+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $PNMTOPS in [\\/]* | ?:[\\/]*) ac_cv_path_PNMTOPS="$PNMTOPS" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PNMTOPS="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi PNMTOPS=$ac_cv_path_PNMTOPS if test -n "$PNMTOPS"; then echo "$as_me:$LINENO: result: $PNMTOPS" >&5 echo "${ECHO_T}$PNMTOPS" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test "X$PNMTOPS" = "X"; then { echo "$as_me:$LINENO: WARNING: \"Unable to find pnmtops from netpbm\"" >&5 echo "$as_me: WARNING: \"Unable to find pnmtops from netpbm\"" >&2;} BUILD_MANUAL=no fi fi # Check whether --enable-palmosbuild or --disable-palmosbuild was given. if test "${enable_palmosbuild+set}" = set; then enableval="$enable_palmosbuild" BUILD_PRC=no else BUILD_PRC=yes fi; if test "$BUILD_PRC" = "yes"; then subdirs="$subdirs viewer" fi # Check whether --with-lang or --without-lang was given. if test "${with_lang+set}" = set; then withval="$with_lang" fi; # Check whether --enable-category or --disable-category was given. if test "${enable_category+set}" = set; then enableval="$enable_category" fi; # Check whether --enable-armlets or --disable-armlets was given. if test "${enable_armlets+set}" = set; then enableval="$enable_armlets" fi; # Check whether --enable-wait_icon or --disable-wait_icon was given. if test "${enable_wait_icon+set}" = set; then enableval="$enable_wait_icon" fi; # Check whether --enable-errorchecklevel or --disable-errorchecklevel was given. if test "${enable_errorchecklevel+set}" = set; then enableval="$enable_errorchecklevel" fi; # Check whether --enable-gesture_debug or --disable-gesture_debug was given. if test "${enable_gesture_debug+set}" = set; then enableval="$enable_gesture_debug" fi; # Check whether --enable-debug_log or --disable-debug_log was given. if test "${enable_debug_log+set}" = set; then enableval="$enable_debug_log" fi; # Check whether --enable-debug_labels or --disable-debug_labels was given. if test "${enable_debug_labels+set}" = set; then enableval="$enable_debug_labels" fi; # Check whether --enable-imode or --disable-imode was given. if test "${enable_imode+set}" = set; then enableval="$enable_imode" fi; # Check whether --enable-scroll_to_bottom or --disable-scroll_to_bottom was given. if test "${enable_scroll_to_bottom+set}" = set; then enableval="$enable_scroll_to_bottom" fi; # Check whether --enable-hires or --disable-hires was given. if test "${enable_hires+set}" = set; then enableval="$enable_hires" fi; # Check whether --enable-rotate or --disable-rotate was given. if test "${enable_rotate+set}" = set; then enableval="$enable_rotate" fi; # Check whether --enable-palm_dia or --disable-palm_dia was given. if test "${enable_palm_dia+set}" = set; then enableval="$enable_palm_dia" fi; # Check whether --enable-anti_alias or --disable-anti_alias was given. if test "${enable_anti_alias+set}" = set; then enableval="$enable_anti_alias" fi; # Check whether --enable-vfs_fonts or --disable-vfs_fonts was given. if test "${enable_vfs_fonts+set}" = set; then enableval="$enable_vfs_fonts" fi; # Check whether --enable-word_lookup or --disable-word_lookup was given. if test "${enable_word_lookup+set}" = set; then enableval="$enable_word_lookup" fi; # Check whether --enable-transliteration or --disable-transliteration was given. if test "${enable_transliteration+set}" = set; then enableval="$enable_transliteration" fi; # Check whether --enable-skins or --disable-skins was given. if test "${enable_skins+set}" = set; then enableval="$enable_skins" fi; # Check whether --enable-returntoapp or --disable-returntoapp was given. if test "${enable_returntoapp+set}" = set; then enableval="$enable_returntoapp" fi; # Check whether --with-handera or --without-handera was given. if test "${with_handera+set}" = set; then withval="$with_handera" fi; # Check whether --with-handspring or --without-handspring was given. if test "${with_handspring+set}" = set; then withval="$with_handspring" fi; # Check whether --with-sony or --without-sony was given. if test "${with_sony+set}" = set; then withval="$with_sony" fi; # Check whether --with-sonysilk or --without-sonysilk was given. if test "${with_sonysilk+set}" = set; then withval="$with_sonysilk" fi; # Check whether --with-fiveway or --without-fiveway was given. if test "${with_fiveway+set}" = set; then withval="$with_fiveway" fi; # Check whether --with-axxpac or --without-axxpac was given. if test "${with_axxpac+set}" = set; then withval="$with_axxpac" fi; # Check whether --with-palmcunit or --without-palmcunit was given. if test "${with_palmcunit+set}" = set; then withval="$with_palmcunit" fi; # Check whether --enable-desktopbuild or --disable-desktopbuild was given. if test "${enable_desktopbuild+set}" = set; then enableval="$enable_desktopbuild" BUILD_DESKTOP=no fi; if test "$BUILD_DESKTOP" = "yes"; then ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then echo "$as_me:$LINENO: result: $CXX" >&5 echo "${ECHO_T}$CXX" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 echo "${ECHO_T}$ac_ct_CXX" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CXX" && break done test -n "$ac_ct_CXX" || ac_ct_CXX="g++" CXX=$ac_ct_CXX fi # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C++ compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. echo "$as_me:$LINENO: checking for C++ compiler default output" >&5 echo $ECHO_N "checking for C++ compiler default output... $ECHO_C" >&6 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 (eval $ac_link_default) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Find the output, starting from the most likely. This scheme is # not robust to junk in `.', hence go to wildcards (a.*) only as a last # resort. # Be careful to initialize this variable, since it used to be cached. # Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. ac_cv_exeext= # b.out is created by i960 compilers. for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; conftest.$ac_ext ) # This is the source file. ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` # FIXME: I believe we export ac_cv_exeext for Libtool, # but it would be cool to find out if it's true. Does anybody # maintain Libtool? --akim. export ac_cv_exeext break;; * ) break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C++ compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C++ compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6 # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether the C++ compiler works" >&5 echo $ECHO_N "checking whether the C++ compiler works... $ECHO_C" >&6 # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6 echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` export ac_cv_exeext break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6 rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6 OBJEXT=$ac_cv_objext ac_objext=$OBJEXT echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 if test "${ac_cv_cxx_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 GXX=`test $ac_compiler_gnu = yes && echo yes` ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS CXXFLAGS="-g" echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cxx_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cxx_g=no fi rm -f conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi for ac_declaration in \ ''\ '#include ' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu OUTPUT_FILES="$OUTPUT_FILES plucker_desktop/Makefile" fi # Check whether --enable-unpluck or --disable-unpluck was given. if test "${enable_unpluck+set}" = set; then enableval="$enable_unpluck" BUILD_UNPLUCK=$enableval else BUILD_UNPLUCK=yes fi; # Check whether --enable-explode or --disable-explode was given. if test "${enable_explode+set}" = set; then enableval="$enable_explode" BUILD_EXPLODE=$enableval else BUILD_EXPLODE=yes fi; ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CC" && break done CC=$ac_ct_CC fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS CFLAGS="-g" echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cc_g=no fi rm -f conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 if test "${ac_cv_prog_cc_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_stdc=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF # Don't try gcc -ansi; that turns off useful extensions and # breaks some systems' header files. # AIX -qlanglvl=ansi # Ultrix and OSF/1 -std1 # HP-UX 10.20 and later -Ae # HP-UX older versions -Aa -D_HPUX_SOURCE # SVR4 -Xc -D__EXTENSIONS__ for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_stdc=$ac_arg break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.$ac_objext done rm -f conftest.$ac_ext conftest.$ac_objext CC=$ac_save_CC fi case "x$ac_cv_prog_cc_stdc" in x|xno) echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6 ;; *) echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 CC="$CC $ac_cv_prog_cc_stdc" ;; esac # Some people use a C++ compiler to compile C. Since we use `exit', # in C++ we need to declare it. In case someone uses the same compiler # for both compiling C and C++ we need to have the C++ compiler decide # the declaration of exit, since it's the most demanding environment. cat >conftest.$ac_ext <<_ACEOF #ifndef __cplusplus choke me #endif _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then for ac_declaration in \ ''\ '#include ' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$CPP" >&6 ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6 if test "${ac_cv_prog_egrep+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if echo a | (grep -E '(a|b)') >/dev/null 2>&1 then ac_cv_prog_egrep='grep -E' else ac_cv_prog_egrep='egrep' fi fi echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 echo "${ECHO_T}$ac_cv_prog_egrep" >&6 EGREP=$ac_cv_prog_egrep echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6 if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done if test "${ac_cv_header_zlib_h+set}" = set; then echo "$as_me:$LINENO: checking for zlib.h" >&5 echo $ECHO_N "checking for zlib.h... $ECHO_C" >&6 if test "${ac_cv_header_zlib_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: $ac_cv_header_zlib_h" >&5 echo "${ECHO_T}$ac_cv_header_zlib_h" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking zlib.h usability" >&5 echo $ECHO_N "checking zlib.h usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking zlib.h presence" >&5 echo $ECHO_N "checking zlib.h presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc in yes:no ) { echo "$as_me:$LINENO: WARNING: zlib.h: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: zlib.h: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: zlib.h: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: zlib.h: proceeding with the preprocessor's result" >&2;} ( cat <<\_ASBOX ## ------------------------------------ ## ## Report this to bug-autoconf@gnu.org. ## ## ------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; no:yes ) { echo "$as_me:$LINENO: WARNING: zlib.h: present but cannot be compiled" >&5 echo "$as_me: WARNING: zlib.h: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: zlib.h: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: zlib.h: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: zlib.h: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: zlib.h: proceeding with the preprocessor's result" >&2;} ( cat <<\_ASBOX ## ------------------------------------ ## ## Report this to bug-autoconf@gnu.org. ## ## ------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for zlib.h" >&5 echo $ECHO_N "checking for zlib.h... $ECHO_C" >&6 if test "${ac_cv_header_zlib_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_header_zlib_h=$ac_header_preproc fi echo "$as_me:$LINENO: result: $ac_cv_header_zlib_h" >&5 echo "${ECHO_T}$ac_cv_header_zlib_h" >&6 fi if test $ac_cv_header_zlib_h = yes; then has_zlib_header=yes fi if test "${ac_cv_header_jpeglib_h+set}" = set; then echo "$as_me:$LINENO: checking for jpeglib.h" >&5 echo $ECHO_N "checking for jpeglib.h... $ECHO_C" >&6 if test "${ac_cv_header_jpeglib_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: $ac_cv_header_jpeglib_h" >&5 echo "${ECHO_T}$ac_cv_header_jpeglib_h" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking jpeglib.h usability" >&5 echo $ECHO_N "checking jpeglib.h usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking jpeglib.h presence" >&5 echo $ECHO_N "checking jpeglib.h presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc in yes:no ) { echo "$as_me:$LINENO: WARNING: jpeglib.h: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: jpeglib.h: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: jpeglib.h: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: jpeglib.h: proceeding with the preprocessor's result" >&2;} ( cat <<\_ASBOX ## ------------------------------------ ## ## Report this to bug-autoconf@gnu.org. ## ## ------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; no:yes ) { echo "$as_me:$LINENO: WARNING: jpeglib.h: present but cannot be compiled" >&5 echo "$as_me: WARNING: jpeglib.h: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: jpeglib.h: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: jpeglib.h: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: jpeglib.h: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: jpeglib.h: proceeding with the preprocessor's result" >&2;} ( cat <<\_ASBOX ## ------------------------------------ ## ## Report this to bug-autoconf@gnu.org. ## ## ------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for jpeglib.h" >&5 echo $ECHO_N "checking for jpeglib.h... $ECHO_C" >&6 if test "${ac_cv_header_jpeglib_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_header_jpeglib_h=$ac_header_preproc fi echo "$as_me:$LINENO: result: $ac_cv_header_jpeglib_h" >&5 echo "${ECHO_T}$ac_cv_header_jpeglib_h" >&6 fi if test $ac_cv_header_jpeglib_h = yes; then has_jpeg_header=yes fi echo "$as_me:$LINENO: checking for deflateEnd in -lz" >&5 echo $ECHO_N "checking for deflateEnd in -lz... $ECHO_C" >&6 if test "${ac_cv_lib_z_deflateEnd+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char deflateEnd (); int main () { deflateEnd (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_z_deflateEnd=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_z_deflateEnd=no fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_z_deflateEnd" >&5 echo "${ECHO_T}$ac_cv_lib_z_deflateEnd" >&6 if test $ac_cv_lib_z_deflateEnd = yes; then LIBS="$LIBS -lz" ; has_zlib_library=yes else has_zlib_library=no fi echo "$as_me:$LINENO: checking for jpeg_start_compress in -ljpeg" >&5 echo $ECHO_N "checking for jpeg_start_compress in -ljpeg... $ECHO_C" >&6 if test "${ac_cv_lib_jpeg_jpeg_start_compress+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljpeg $LIBS" cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char jpeg_start_compress (); int main () { jpeg_start_compress (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_jpeg_jpeg_start_compress=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_jpeg_jpeg_start_compress=no fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_jpeg_jpeg_start_compress" >&5 echo "${ECHO_T}$ac_cv_lib_jpeg_jpeg_start_compress" >&6 if test $ac_cv_lib_jpeg_jpeg_start_compress = yes; then LIBS="$LIBS -ljpeg"; has_jpeg_library=yes else has_jpeg_library=no fi if test "$BUILD_UNPLUCK" != "yes"; then echo "$as_me:$LINENO: result: libunpluck will not be built, by request" >&5 echo "${ECHO_T}libunpluck will not be built, by request" >&6 BUILD_UNPLUCK=no elif test "${has_zlib_header:-no}" = "no"; then echo "$as_me:$LINENO: result: libunpluck will not be built, because zlib include file is not installed" >&5 echo "${ECHO_T}libunpluck will not be built, because zlib include file is not installed" >&6 BUILD_UNPLUCK=no elif test "$has_zlib_library" = "no" ; then echo "$as_me:$LINENO: result: libunpluck will not be built, because zlib library is not installed" >&5 echo "${ECHO_T}libunpluck will not be built, because zlib library is not installed" >&6 BUILD_UNPLUCK=no fi if test "$BUILD_EXPLODE" = "no" ; then echo "$as_me:$LINENO: result: explode will not be built, by request" >&5 echo "${ECHO_T}explode will not be built, by request" >&6 BUILD_EXPLODE=no elif test "$BUILD_UNPLUCK" = "no"; then echo "$as_me:$LINENO: result: explode will not be built, because libunpluck was not built" >&5 echo "${ECHO_T}explode will not be built, because libunpluck was not built" >&6 BUILD_EXPLODE=no elif test "${has_jpeg_header:-no}" = "no"; then echo "$as_me:$LINENO: result: explode will not be built, because the libjpeg header file is not installed" >&5 echo "${ECHO_T}explode will not be built, because the libjpeg header file is not installed" >&6 BUILD_EXPLODE=no elif test "$has_jpeg_library" = "no" ; then echo "$as_me:$LINENO: result: explode will not be built, because the libjpeg library is not installed" >&5 echo "${ECHO_T}explode will not be built, because the libjpeg library is not installed" >&6 BUILD_EXPLODE=no fi if test "$BUILD_UNPLUCK" = "yes"; then OUTPUT_FILES="$OUTPUT_FILES tools/unpluck/Makefile" fi if test "$BUILD_EXPLODE" = "yes"; then OUTPUT_FILES="$OUTPUT_FILES tools/explode/Makefile tools/explode/netscape4-plucker-helper" fi # Extract the first word of "at", so it can be a program name with args. set dummy at; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_AT_PROG+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $AT_PROG in [\\/]* | ?:[\\/]*) ac_cv_path_AT_PROG="$AT_PROG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_AT_PROG="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_path_AT_PROG" && ac_cv_path_AT_PROG="at" ;; esac fi AT_PROG=$ac_cv_path_AT_PROG if test -n "$AT_PROG"; then echo "$as_me:$LINENO: result: $AT_PROG" >&5 echo "${ECHO_T}$AT_PROG" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi # Extract the first word of "rm", so it can be a program name with args. set dummy rm; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_RM_PROG+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $RM_PROG in [\\/]* | ?:[\\/]*) ac_cv_path_RM_PROG="$RM_PROG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_RM_PROG="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_path_RM_PROG" && ac_cv_path_RM_PROG="rm" ;; esac fi RM_PROG=$ac_cv_path_RM_PROG if test -n "$RM_PROG"; then echo "$as_me:$LINENO: result: $RM_PROG" >&5 echo "${ECHO_T}$RM_PROG" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi # Extract the first word of "netscape", so it can be a program name with args. set dummy netscape; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_NETSCAPE_PROG+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $NETSCAPE_PROG in [\\/]* | ?:[\\/]*) ac_cv_path_NETSCAPE_PROG="$NETSCAPE_PROG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_NETSCAPE_PROG="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_path_NETSCAPE_PROG" && ac_cv_path_NETSCAPE_PROG="netscape" ;; esac fi NETSCAPE_PROG=$ac_cv_path_NETSCAPE_PROG if test -n "$NETSCAPE_PROG"; then echo "$as_me:$LINENO: result: $NETSCAPE_PROG" >&5 echo "${ECHO_T}$NETSCAPE_PROG" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi # Check whether --enable-gtkviewer or --disable-gtkviewer was given. if test "${enable_gtkviewer+set}" = set; then enableval="$enable_gtkviewer" BUILD_GTKVIEWER=$enableval else BUILD_GTKVIEWER=yes fi; GTK2INCLUDES= GTK2LIBS= if test "$BUILD_UNPLUCK" = "no" ; then echo "$as_me:$LINENO: result: GTK+ viewer will not be built, because libunpluck is not being built" >&5 echo "${ECHO_T}GTK+ viewer will not be built, because libunpluck is not being built" >&6 BUILD_GTKVIEWER=no elif test "$BUILD_GTKVIEWER" = yes ; then # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_PKG_CONFIG+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5 echo "${ECHO_T}$PKG_CONFIG" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test x$PKG_CONFIG != x; then echo "$as_me:$LINENO: checking for GTK+ version 2" >&5 echo $ECHO_N "checking for GTK+ version 2... $ECHO_C" >&6 GTK2INCLUDES="`$PKG_CONFIG --cflags gtk+-2.0`" GTK2LIBS="`$PKG_CONFIG --libs gtk+-2.0`" if test "x$GTK2INCLUDES" = x -o "x$GTK2LIBS" = x ; then echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 echo "$as_me:$LINENO: result: GTK+ viewer will not be built, because GTK+ 2.x is missing or badly installed" >&5 echo "${ECHO_T}GTK+ viewer will not be built, because GTK+ 2.x is missing or badly installed" >&6 BUILD_GTKVIEWER=no else echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 fi else echo "$as_me:$LINENO: result: GTK+ viewer will not be built, because pkg-config is not installed" >&5 echo "${ECHO_T}GTK+ viewer will not be built, because pkg-config is not installed" >&6 BUILD_GTKVIEWER=no fi else echo "$as_me:$LINENO: result: GTK+ viewer will not be built, by request" >&5 echo "${ECHO_T}GTK+ viewer will not be built, by request" >&6 fi ac_config_files="$ac_config_files $OUTPUT_FILES" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. { (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | sed ' t clear : clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache if diff $cache_file confcache >/dev/null 2>&1; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; }' fi # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then we branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. cat >confdef2opt.sed <<\_ACEOF t clear : clear s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g t quote s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g t quote d : quote s,[ `~#$^&*(){}\\|;'"<>?],\\&,g s,\[,\\&,g s,\],\\&,g s,\$,$$,g p _ACEOF # We use echo to avoid assuming a particular line-breaking character. # The extra dot is to prevent the shell from consuming trailing # line-breaks from the sub-command output. A line-break within # single-quotes doesn't work because, if this script is created in a # platform that uses two characters for line-breaks (e.g., DOS), tr # would break. ac_LF_and_DOT=`echo; echo .` DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` rm -f confdef2opt.sed ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_i=`echo "$ac_i" | sed 's/\$U\././;s/\.o$//;s/\.obj$//'` # 2. Add them. ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi # Support unset when possible. if (FOO=FOO; unset FOO) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" # Sed expression to map a string onto a valid variable name. as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH exec 6>&1 # Open the log real soon, to keep \$[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. Logging --version etc. is OK. exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX } >&5 cat >&5 <<_CSEOF This file was extended by $as_me, which was generated by GNU Autoconf 2.57. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ _CSEOF echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 echo >&5 _ACEOF # Files that config.status was made for. if test -n "$ac_config_files"; then echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS fi if test -n "$ac_config_headers"; then echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS fi if test -n "$ac_config_links"; then echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS fi if test -n "$ac_config_commands"; then echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS fi cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.57, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir INSTALL="$INSTALL" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "x$1" : 'x\([^=]*\)='` ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` ac_shift=: ;; -*) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; *) # This is not an option, so the user has probably given explicit # arguments. ac_option=$1 ac_need_defaults=false;; esac case $ac_option in # Handling of the options. _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) # Conflict between --help and --header { { echo "$as_me:$LINENO: error: ambiguous option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. "$OUTPUT_FILES" ) CONFIG_FILES="$CONFIG_FILES $OUTPUT_FILES" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason to put it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Create a temporary directory, and hook for its removal unless debugging. $debug || { trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./confstat$$-$RANDOM (umask 077 && mkdir $tmp) } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "\$CONFIG_FILES"; then # Protect against being on the right side of a sed subst in config.status. sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF s,@SHELL@,$SHELL,;t t s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t s,@exec_prefix@,$exec_prefix,;t t s,@prefix@,$prefix,;t t s,@program_transform_name@,$program_transform_name,;t t s,@bindir@,$bindir,;t t s,@sbindir@,$sbindir,;t t s,@libexecdir@,$libexecdir,;t t s,@datadir@,$datadir,;t t s,@sysconfdir@,$sysconfdir,;t t s,@sharedstatedir@,$sharedstatedir,;t t s,@localstatedir@,$localstatedir,;t t s,@libdir@,$libdir,;t t s,@includedir@,$includedir,;t t s,@oldincludedir@,$oldincludedir,;t t s,@infodir@,$infodir,;t t s,@mandir@,$mandir,;t t s,@build_alias@,$build_alias,;t t s,@host_alias@,$host_alias,;t t s,@target_alias@,$target_alias,;t t s,@DEFS@,$DEFS,;t t s,@ECHO_C@,$ECHO_C,;t t s,@ECHO_N@,$ECHO_N,;t t s,@ECHO_T@,$ECHO_T,;t t s,@LIBS@,$LIBS,;t t s,@PACKAGE@,$PACKAGE,;t t s,@VERSION@,$VERSION,;t t s,@RANLIB@,$RANLIB,;t t s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t s,@PYTHON@,$PYTHON,;t t s,@PYTHON_LIBDIR@,$PYTHON_LIBDIR,;t t s,@JAVA@,$JAVA,;t t s,@JAVAC@,$JAVAC,;t t s,@JYTHON@,$JYTHON,;t t s,@JYTHONC@,$JYTHONC,;t t s,@JAR@,$JAR,;t t s,@JAVA_DISTILLER_TARGET@,$JAVA_DISTILLER_TARGET,;t t s,@JAVA_HOME@,$JAVA_HOME,;t t s,@JAVA_CLASSPATH@,$JAVA_CLASSPATH,;t t s,@PNMTOPALM@,$PNMTOPALM,;t t s,@PPMQUANT@,$PPMQUANT,;t t s,@PPMTOTBMP@,$PPMTOTBMP,;t t s,@MOGRIFY@,$MOGRIFY,;t t s,@IMAGEHACKING@,$IMAGEHACKING,;t t s,@AUTOCONF@,$AUTOCONF,;t t s,@MODULE_DIR@,$MODULE_DIR,;t t s,@PLUCKERDIR@,$PLUCKERDIR,;t t s,@COMICS_DIR@,$COMICS_DIR,;t t s,@COMICSLIST_DIR@,$COMICSLIST_DIR,;t t s,@DOCDIR@,$DOCDIR,;t t s,@NLSDIR@,$NLSDIR,;t t s,@SED@,$SED,;t t s,@LATEX@,$LATEX,;t t s,@L2H@,$L2H,;t t s,@GIFTOPNM@,$GIFTOPNM,;t t s,@PNMTOPS@,$PNMTOPS,;t t s,@BUILD_MANUAL@,$BUILD_MANUAL,;t t s,@subdirs@,$subdirs,;t t s,@BUILD_PRC@,$BUILD_PRC,;t t s,@CXX@,$CXX,;t t s,@CXXFLAGS@,$CXXFLAGS,;t t s,@LDFLAGS@,$LDFLAGS,;t t s,@CPPFLAGS@,$CPPFLAGS,;t t s,@ac_ct_CXX@,$ac_ct_CXX,;t t s,@EXEEXT@,$EXEEXT,;t t s,@OBJEXT@,$OBJEXT,;t t s,@BUILD_DESKTOP@,$BUILD_DESKTOP,;t t s,@CC@,$CC,;t t s,@CFLAGS@,$CFLAGS,;t t s,@ac_ct_CC@,$ac_ct_CC,;t t s,@CPP@,$CPP,;t t s,@EGREP@,$EGREP,;t t s,@AT_PROG@,$AT_PROG,;t t s,@RM_PROG@,$RM_PROG,;t t s,@NETSCAPE_PROG@,$NETSCAPE_PROG,;t t s,@BUILD_UNPLUCK@,$BUILD_UNPLUCK,;t t s,@BUILD_EXPLODE@,$BUILD_EXPLODE,;t t s,@BUILD_GTKVIEWER@,$BUILD_GTKVIEWER,;t t s,@GTK2INCLUDES@,$GTK2INCLUDES,;t t s,@GTK2LIBS@,$GTK2LIBS,;t t s,@PKG_CONFIG@,$PKG_CONFIG,;t t s,@LIBOBJS@,$LIBOBJS,;t t s,@LTLIBOBJS@,$LTLIBOBJS,;t t CEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_lines=48 ac_sed_frag=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_lines # Line after last line for current file. ac_more_lines=: ac_sed_cmds= while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag else sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag fi if test ! -s $tmp/subs.frag; then ac_more_lines=false else # The purpose of the label and of the branching condition is to # speed up the sed processing (if there are no `@' at all, there # is no need to browse any of the substitutions). # These are the two extra sed commands mentioned above. (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_lines` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi fi # test -n "$CONFIG_FILES" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be # absolute. ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_builddir$INSTALL ;; esac if test x"$ac_file" != x-; then { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} rm -f "$ac_file" fi # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then configure_input= else configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } echo $f;; *) # Relative if test -f "$f"; then # Build tree echo $f elif test -f "$srcdir/$f"; then # Source tree echo $srcdir/$f else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s,@configure_input@,$configure_input,;t t s,@srcdir@,$ac_srcdir,;t t s,@abs_srcdir@,$ac_abs_srcdir,;t t s,@top_srcdir@,$ac_top_srcdir,;t t s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t s,@builddir@,$ac_builddir,;t t s,@abs_builddir@,$ac_abs_builddir,;t t s,@top_builddir@,$ac_top_builddir,;t t s,@abs_top_builddir@,$ac_abs_top_builddir,;t t s,@INSTALL@,$ac_INSTALL,;t t " $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out rm -f $tmp/stdin if test x"$ac_file" != x-; then mv $tmp/out $ac_file else cat $tmp/out rm -f $tmp/out fi done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi # # CONFIG_SUBDIRS section. # if test "$no_recursion" != yes; then # Remove --cache-file and --srcdir arguments so they do not pile up. ac_sub_configure_args= ac_prev= for ac_arg in $ac_configure_args; do if test -n "$ac_prev"; then ac_prev= continue fi case $ac_arg in -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ | --c=*) ;; --config-cache | -C) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ;; *) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;; esac done # Always prepend --prefix to ensure using the same prefix # in subdir configurations. ac_sub_configure_args="--prefix=$prefix $ac_sub_configure_args" ac_popdir=`pwd` for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue # Do not complain, so a configure script can configure whichever # parts of a large source tree are present. test -d $srcdir/$ac_dir || continue { echo "$as_me:$LINENO: configuring in $ac_dir" >&5 echo "$as_me: configuring in $ac_dir" >&6;} { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be # absolute. ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` cd $ac_dir # Check for guested configure; otherwise get Cygnus style configure. if test -f $ac_srcdir/configure.gnu; then ac_sub_configure="$SHELL '$ac_srcdir/configure.gnu'" elif test -f $ac_srcdir/configure; then ac_sub_configure="$SHELL '$ac_srcdir/configure'" elif test -f $ac_srcdir/configure.in; then ac_sub_configure=$ac_configure else { echo "$as_me:$LINENO: WARNING: no configuration information is in $ac_dir" >&5 echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} ac_sub_configure= fi # The recursion is here. if test -n "$ac_sub_configure"; then # Make the cache file name correct relative to the subdirectory. case $cache_file in [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; *) # Relative path. ac_sub_cache_file=$ac_top_builddir$cache_file ;; esac { echo "$as_me:$LINENO: running $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 echo "$as_me: running $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} # The eval makes quoting arguments work. eval $ac_sub_configure $ac_sub_configure_args \ --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir || { { echo "$as_me:$LINENO: error: $ac_sub_configure failed for $ac_dir" >&5 echo "$as_me: error: $ac_sub_configure failed for $ac_dir" >&2;} { (exit 1); exit 1; }; } fi cd $ac_popdir done fi echo echo "Installation path prefix: $prefix" echo "Installation path prefix for binaries: $bindir" echo "Installation path prefix for libraries: $libdir" echo "Installation path prefix for documentation: $DOCDIR" echo "Installation path prefix for Plucker data: $PLUCKERDIR" echo "Installation path prefix for Python parser: $MODULE_DIR" echo if test "X$IMAGEHACKING" = "X" ; then echo "$as_me:$LINENO: result: ** WARNING * WARNING * WARNING * WARNING * WARNING * WARNING **" >&5 echo "${ECHO_T}** WARNING * WARNING * WARNING * WARNING * WARNING * WARNING **" >&6 echo "$as_me:$LINENO: result: There seem to be no appropriate image tools available." >&5 echo "${ECHO_T} There seem to be no appropriate image tools available." >&6 echo "$as_me:$LINENO: result: See the REQUIREMENTS file for information on what's needed." >&5 echo "${ECHO_T} See the REQUIREMENTS file for information on what's needed." >&6 echo "$as_me:$LINENO: result: ** WARNING * WARNING * WARNING * WARNING * WARNING * WARNING **" >&5 echo "${ECHO_T}** WARNING * WARNING * WARNING * WARNING * WARNING * WARNING **" >&6 echo "$as_me:$LINENO: result: \"\"" >&5 echo "${ECHO_T}\"\"" >&6 fi plucker-1.8/configure.in0100644000076400001440000004041010052666605014361 0ustar mickeusersdnl dnl $Id: configure.in,v 1.109.4.1 2004/05/19 14:21:57 nordstrom Exp $ dnl dnl Plucker autoconf input dnl dnl AC_PREREQ(2.13) AC_INIT(unix/install-plucker) PACKAGE=plucker VERSION="1.8" AC_SUBST(PACKAGE) AC_SUBST(VERSION) dnl ================ dnl Setup the prefix dnl ================ if test "X${prefix}" = "XNONE"; then prefix=/usr/local fi if test "X${exec_prefix}" = "XNONE"; then exec_prefix=$prefix fi bindir=`eval echo $bindir` libdir=`eval echo $libdir` datadir=`eval echo $datadir` sysconfdir=`eval echo $sysconfdir` dnl =============================== dnl Build options dnl =============================== BUILD_MANUAL=yes BUILD_DESKTOP=yes BUILD_GTKVIEWER=yes OUTPUT_FILES="Makefile unix/setup.py parser/Makefile parser/python/Makefile parser/python/PyPlucker/Makefile parser/python/PyPlucker/__init__.py docs/Makefile tools/Makefile tools/pluck-comics/Makefile tools/pluck-comics/pluck-comics.py viewer-GTK+2-POSIX/Makefile" dnl =============================== dnl General programs dnl =============================== AC_PROG_RANLIB AC_PROG_INSTALL dnl =============================== dnl Python Distiller Section dnl =============================== AC_PATH_PROG(PYTHON, python) if test "X$PYTHON" = "X"; then AC_MSG_ERROR("Unable to find python") fi AC_MSG_CHECKING("Python version") PYTHON_MAJOR_LIBVER=[`$PYTHON -c "\ import sys, string print string.splitfields(string.splitfields(sys.version, ' ')[0], '.')[0]"`] PYTHON_MINOR_LIBVER=[`$PYTHON -c "\ import sys, string print string.splitfields(string.splitfields(sys.version, ' ')[0], '.')[1]"`] PYTHON_MINOR_MINOR_VER=[`$PYTHON -c "\ import sys, string fields = string.splitfields(string.splitfields(sys.version, ' ')[0], '.') if (len(fields) > 2) and (fields[2][0] in '0123456789'): print fields[2][0] else: print '0'"`] AC_MSG_RESULT("$PYTHON_MAJOR_LIBVER.$PYTHON_MINOR_LIBVER.$PYTHON_MINOR_MINOR_VER") if test $PYTHON_MAJOR_LIBVER -gt 1 -o $PYTHON_MINOR_LIBVER -gt 5 -o \( $PYTHON_MINOR_LIBVER -eq 5 -a $PYTHON_MINOR_MINOR_VER -ge 2 \); then PYTHON_LIBDIR=[`$PYTHON -c "import sys, os; print os.path.join(os.path.join(sys.prefix, 'lib'),'python%s.%s' % ($PYTHON_MAJOR_LIBVER, $PYTHON_MINOR_LIBVER))"`] else AC_MSG_ERROR(["Python version too low -- at least 1.5.2 is required."]) fi AC_SUBST(PYTHON_LIBDIR) dnl =============================== dnl Java Distiller Section dnl =============================== AC_ARG_ENABLE(java-distiller, [ --enable-java-distiller build the Java version of the distiller [yes]], build_java_distiller=$enableval, build_java_distiller=yes) JAVA_DISTILLER_TARGET= JAVA_HOME= : ${CLASSPATH=.} if test "$build_java_distiller" = "no" ; then AC_MSG_RESULT([Java distiller will not be built, by request]) else AC_ARG_WITH(classpath, [ --with-classpath=CLASSPATH], JAVA_CLASSPATH=$with_classpath, JAVA_CLASSPATH=$CLASSPATH) AC_PATH_PROG(JAVA, java) AC_PATH_PROG(JAVAC, javac) AC_PATH_PROG(JYTHON, jython) AC_PATH_PROG(JYTHONC, jythonc) AC_PATH_PROG(JAR, jar) if test "x$JAVA" = "x" -o "x$JAVAC" = "x" -o "x$JYTHON" = "x" -o "x$JYTHONC" = "x" -o "x$JAR" = "x" ; then AC_MSG_RESULT([Java and/or Jython not available]) else # test for JIU with PalmCodec support if test "x$JAVA_CLASSPATH" = x ; then AC_MSG_RESULT(Using empty CLASSPATH) else AC_MSG_RESULT(Using CLASSPATH of $JAVA_CLASSPATH) fi AC_MSG_CHECKING(for Java Imaging Utilities with Palm support) CLASSPATH=$JAVA_CLASSPATH $JYTHON - </tmp/jiu-test.$$ 2>/dev/null import sys try: import net.sourceforge.jiu.codecs if 'PalmCodec' in dir(net.sourceforge.jiu.codecs): sys.stdout.write('1\n') else: sys.stdout.write('0\n') except: sys.stdout.write('0\n') EOF jiutest=`cat /tmp/jiu-test.$$` if test "$jiutest" = "1"; then AC_MSG_RESULT(available) JAVA_DISTILLER_TARGET=plucker-build.jar # Apple insists you use /Library/Java/Home for their JAVAHOME, so check for that if test -d /Library/Java/Home ; then JAVA_HOME="/Library/Java/Home" else JAVA_HOME="`$JYTHON -c \"import java; print java.lang.System.getProperty('java.home')\"`" fi else AC_MSG_RESULT(not available) fi rm -rf /tmp/jiu-test.$$ fi fi AC_SUBST(JAVA_DISTILLER_TARGET) AC_SUBST(JAVA_HOME) AC_SUBST(JAVA_CLASSPATH) dnl ================================ dnl Image processing dnl dnl First, check for pnmtopalm. If we have that, we have color support. dnl If we have pnmtopalm: dnl Check also for ppmquant (netpbm). If found, use "netpbm2". dnl If no pnmtopalm: dnl First check for PIL. If found, configure to use it via "pil2". dnl If no PIL, check for ppmtoTbmp. If not found, error out. dnl Check for netpbm and imagemagick (check for "mogrify"), and configure dnl to use one of them in conjunction with ppmtoTbmp. dnl ================================ AC_PATH_PROG(PNMTOPALM, pnmtopalm) AC_PATH_PROG(PPMQUANT, ppmquant) AC_PATH_PROG(PPMTOTBMP, ppmtoTbmp) AC_PATH_PROG(MOGRIFY, mogrify) AC_MSG_CHECKING("for PIL") [$PYTHON -c 'import Image' >/dev/null 2>&1 if test $? = "0"; then HAS_PIL=yes else HAS_PIL=no fi] AC_MSG_RESULT($HAS_PIL) dnl Now figure out the default setting for image_parser AC_MSG_CHECKING("what to use for image transformation") AC_SUBST(IMAGEHACKING) IMAGEHACKING="" if test "X$PNMTOPALM" != "X" ; then if test "X$PPMQUANT" != "X" ; then IMAGEHACKING="netpbm2" fi elif test "$HAS_PIL" = "yes" ; then IMAGEHACKING="pil2" elif test "X$PPMTOTBMP" != "X" ; then if test "X$PPMQUANT" != "X" ; then IMAGEHACKING="netpbm" elif test "X$MOGRIFY" != "X" ; then IMAGEHACKING="imagemagick" fi fi if test "X$IMAGEHACKING" = "X" ; then AC_MSG_RESULT("nothing available") else AC_MSG_RESULT($IMAGEHACKING) fi dnl ================================ dnl General apps dnl ================================ AC_PATH_PROG(AUTOCONF, autoconf, autoconf) dnl ======================================= dnl OPTIONS dnl ======================================= AC_ARG_WITH(pypluckerdir, [ --with-pypluckerdir=PATH specify where the Python parser should go [PYTHON_LIBDIR/site-packages/PyPlucker]]) if test "X$with_pypluckerdir" != "X"; then MODULE_DIR=$with_pypluckerdir else MODULE_DIR="$PYTHON_LIBDIR/site-packages/PyPlucker" fi AC_SUBST(MODULE_DIR) AC_ARG_WITH(pluckerdir, [ --with-pluckerdir=PATH specify where the Plucker data should go [DATADIR/plucker]]) if test "X$with_pluckerdir" != "X"; then PLUCKERDIR=$with_pluckerdir else PLUCKERDIR=$datadir/plucker fi AC_SUBST(PLUCKERDIR) AC_ARG_WITH(comicsdir, [ --with-comicsdir=PATH specify where pluck-comics should put the downloaded comics [/var/spool/netcomics]]) if test "X$with_comicsdir" != "X"; then COMICS_DIR=$with_comicsdir else COMICS_DIR=/var/spool/netcomics fi COMICSLIST_DIR=$PLUCKERDIR/comics AC_SUBST(COMICS_DIR) AC_SUBST(COMICSLIST_DIR) AC_ARG_WITH(docdir, [ --with-docdir=PATH specify where the Plucker documentation should go [PLUCKERDIR/doc]]) if test "X$DOCDIR" = "X"; then if test "X$with_docdir" != "X"; then DOCDIR=$with_docdir else DOCDIR=$PLUCKERDIR/doc fi fi AC_SUBST(DOCDIR) AC_ARG_WITH(nlsdir, [ --with-nlsdir=PATH specify where the locale stuff should go [DATADIR/locale]]) if test "X$NLSDIR" = "X"; then if test "X$with_nlsdir" != "X"; then NLSDIR=$with_nlsdir else NLSDIR=$datadir/locale fi fi AC_SUBST(NLSDIR) dnl =============================================== dnl Check for tools required to build the documents dnl =============================================== AC_ARG_ENABLE(docbuild, [ --disable-docbuild don't build the documentation ], BUILD_MANUAL=no) if test "$BUILD_MANUAL" = "yes"; then AC_PATH_PROGS(SED, gsed sed) [$SED --version 2>&1 < /dev/null | grep GNU >/dev/null 2>&1] if test "$?" != "0" ; then AC_MSG_WARN("Version of sed on path must be GNU sed to build manual") BUILD_MANUAL=no fi AC_PATH_PROG(LATEX, latex) if test "X$LATEX" = "X"; then AC_MSG_WARN("Unable to find latex") BUILD_MANUAL=no fi AC_PATH_PROG(L2H, latex2html) if test "X$L2H" = "X"; then AC_MSG_WARN("Unable to find latex2html") BUILD_MANUAL=no fi AC_PATH_PROG(GIFTOPNM, giftopnm) if test "X$GIFTOPNM" = "X"; then AC_MSG_WARN("Unable to find giftopnm from netpbm") BUILD_MANUAL=no fi AC_PATH_PROG(PNMTOPS, pnmtops) if test "X$PNMTOPS" = "X"; then AC_MSG_WARN("Unable to find pnmtops from netpbm") BUILD_MANUAL=no fi fi AC_SUBST(BUILD_MANUAL) dnl ============================================== dnl Viewer Section dnl ============================================== AC_ARG_ENABLE(palmosbuild, [ --disable-palmosbuild don't build the viewer application ], BUILD_PRC=no, BUILD_PRC=yes) if test "$BUILD_PRC" = "yes"; then AC_CONFIG_SUBDIRS(viewer) fi AC_SUBST(BUILD_PRC) AC_ARG_WITH(lang, [ --with-lang=LANG build viewers translated to the given languages ]) AC_ARG_ENABLE(category, [ --enable-category=CATEGORY set the default launcher category]) AC_ARG_ENABLE(armlets, [ --enable-armlets to enable arm-specific code]) AC_ARG_ENABLE(wait_icon, [ --enable-wait-icon=ICON set the wait indicator to ICON (thought-bubble or hourglass)]) AC_ARG_ENABLE(errorchecklevel, [ --enable-errorchecklevel=LEVEL set the ERROR_CHECK_LEVEL to LEVEL (none, partial, or full)]) AC_ARG_ENABLE(gesture_debug, [ --enable-gesture-debug include Graffiti indicator to debug the gestures feature ]) AC_ARG_ENABLE(debug_log, [ --enable-debug-log include macros writing debug info to log file when running viewer in POSE and to memo when running it on a real device ]) AC_ARG_ENABLE(debug_labels, [ --enable-debug-labels include each function's name into the text section to get the function names included in POSE's profiling output ]) AC_ARG_ENABLE(imode, [ --enable-imode to enable i-mode support (also requires the imodeicons.pdb database)]) AC_ARG_ENABLE(scroll_to_bottom, [ --disable-scroll-to-bottom always scroll even pages instead of stopping when the end of the page is reached (will add some extra whitespace at the bottom of the page) ]) AC_ARG_ENABLE(hires, [ --disable-hires to disable hires-specific code]) AC_ARG_ENABLE(rotate, [ --disable-rotate to disable display rotation]) AC_ARG_ENABLE(palm_dia, [ --disable-palm-dia to disable Palm DIA support]) AC_ARG_ENABLE(anti_alias, [ --disable-anti-alias to disable anti-aliased font code]) AC_ARG_ENABLE(vfs_fonts, [ --disable-vfs-fonts to disable user fonts on VFS code]) AC_ARG_ENABLE(word_lookup, [ --enable-word-lookup to enable word lookup support]) AC_ARG_ENABLE(transliteration, [ --disable-transliteration to disable search transliteration]) AC_ARG_ENABLE(skins, [ --enable-skins to enable skins support]) AC_ARG_ENABLE(returntoapp, [ --enable-returntoapp to enable return to previous app on exit]) AC_ARG_WITH(handera, [ --with-handera=DIR use the Handera SDK in DIR]) AC_ARG_WITH(handspring, [ --with-handspring=DIR use the Handspring SDK in DIR]) AC_ARG_WITH(sony, [ --with-sony=DIR use the Sony SDK in DIR]) AC_ARG_WITH(sonysilk, [ --with-sonysilk=DIR path to Sony Silkscreen SDK (specifically, SonySlkw.h)]) AC_ARG_WITH(fiveway, [ --with-fiveway=DIR path to FiveWay SDK (specifically, PalmChars.h)]) AC_ARG_WITH(axxpac, [ --with-axxpac=DIR use the axxPac.h header file in DIR]) AC_ARG_WITH(palmcunit, [ --with-palmcunit=DIR path to PalmCUnit ]) dnl ============================================== dnl Plucker Desktop Section dnl ============================================== AC_ARG_ENABLE(desktopbuild, [ --disable-desktopbuild don't build the GUI desktop tool ], BUILD_DESKTOP=no) if test "$BUILD_DESKTOP" = "yes"; then AC_PROG_CXX OUTPUT_FILES="$OUTPUT_FILES plucker_desktop/Makefile" fi AC_SUBST(BUILD_DESKTOP) dnl ============================================== dnl Unpluck & Explode Section dnl ============================================== AC_ARG_ENABLE(unpluck, [ --disable-unpluck don't build the unpluck library ], BUILD_UNPLUCK=$enableval, BUILD_UNPLUCK=yes) AC_ARG_ENABLE(explode, [ --disable-explode don't build the explode program ], BUILD_EXPLODE=$enableval, BUILD_EXPLODE=yes) AC_PROG_CC AC_CHECK_HEADER(zlib.h, has_zlib_header=yes) AC_CHECK_HEADER(jpeglib.h, has_jpeg_header=yes) AC_CHECK_LIB(z, deflateEnd, [LIBS="$LIBS -lz" ; has_zlib_library=yes], [has_zlib_library=no]) AC_CHECK_LIB(jpeg, jpeg_start_compress, [LIBS="$LIBS -ljpeg"; has_jpeg_library=yes], [has_jpeg_library=no]) if test "$BUILD_UNPLUCK" != "yes"; then AC_MSG_RESULT([libunpluck will not be built, by request]) BUILD_UNPLUCK=no elif test "${has_zlib_header:-no}" = "no"; then AC_MSG_RESULT([libunpluck will not be built, because zlib include file is not installed]) BUILD_UNPLUCK=no elif test "$has_zlib_library" = "no" ; then AC_MSG_RESULT([libunpluck will not be built, because zlib library is not installed]) BUILD_UNPLUCK=no fi if test "$BUILD_EXPLODE" = "no" ; then AC_MSG_RESULT([explode will not be built, by request]) BUILD_EXPLODE=no elif test "$BUILD_UNPLUCK" = "no"; then AC_MSG_RESULT([explode will not be built, because libunpluck was not built]) BUILD_EXPLODE=no elif test "${has_jpeg_header:-no}" = "no"; then AC_MSG_RESULT([explode will not be built, because the libjpeg header file is not installed]) BUILD_EXPLODE=no elif test "$has_jpeg_library" = "no" ; then AC_MSG_RESULT([explode will not be built, because the libjpeg library is not installed]) BUILD_EXPLODE=no fi if test "$BUILD_UNPLUCK" = "yes"; then OUTPUT_FILES="$OUTPUT_FILES tools/unpluck/Makefile" fi if test "$BUILD_EXPLODE" = "yes"; then OUTPUT_FILES="$OUTPUT_FILES tools/explode/Makefile tools/explode/netscape4-plucker-helper" fi AC_PATH_PROG(AT_PROG, at, at) AC_PATH_PROG(RM_PROG, rm, rm) AC_PATH_PROG(NETSCAPE_PROG, netscape, netscape) AC_SUBST(BUILD_UNPLUCK) AC_SUBST(BUILD_EXPLODE) dnl =============================== dnl GTK+2 Viewer section dnl =============================== AC_SUBST(BUILD_GTKVIEWER) AC_ARG_ENABLE(gtkviewer, [ --disable-gtkviewer don't build the GTK+2 viewer ], BUILD_GTKVIEWER=$enableval, BUILD_GTKVIEWER=yes) AC_SUBST(GTK2INCLUDES) AC_SUBST(GTK2LIBS) GTK2INCLUDES= GTK2LIBS= if test "$BUILD_UNPLUCK" = "no" ; then AC_MSG_RESULT([GTK+ viewer will not be built, because libunpluck is not being built]) BUILD_GTKVIEWER=no elif test "$BUILD_GTKVIEWER" = yes ; then AC_PATH_PROG(PKG_CONFIG, pkg-config,) if test x$PKG_CONFIG != x; then AC_MSG_CHECKING(for GTK+ version 2) GTK2INCLUDES="`$PKG_CONFIG --cflags gtk+-2.0`" GTK2LIBS="`$PKG_CONFIG --libs gtk+-2.0`" if test "x$GTK2INCLUDES" = x -o "x$GTK2LIBS" = x ; then AC_MSG_RESULT(no) AC_MSG_RESULT([GTK+ viewer will not be built, because GTK+ 2.x is missing or badly installed]) BUILD_GTKVIEWER=no else AC_MSG_RESULT(yes) fi else AC_MSG_RESULT([GTK+ viewer will not be built, because pkg-config is not installed]) BUILD_GTKVIEWER=no fi else AC_MSG_RESULT([GTK+ viewer will not be built, by request]) fi dnl ========================== dnl Spit out the configuration dnl ========================== AC_OUTPUT($OUTPUT_FILES) echo echo "Installation path prefix: $prefix" echo "Installation path prefix for binaries: $bindir" echo "Installation path prefix for libraries: $libdir" echo "Installation path prefix for documentation: $DOCDIR" echo "Installation path prefix for Plucker data: $PLUCKERDIR" echo "Installation path prefix for Python parser: $MODULE_DIR" echo if test "X$IMAGEHACKING" = "X" ; then AC_MSG_RESULT([** WARNING * WARNING * WARNING * WARNING * WARNING * WARNING **]) AC_MSG_RESULT([ There seem to be no appropriate image tools available.]) AC_MSG_RESULT([ See the REQUIREMENTS file for information on what's needed.]) AC_MSG_RESULT([** WARNING * WARNING * WARNING * WARNING * WARNING * WARNING **]) AC_MSG_RESULT("") fi plucker-1.8/install-sh0100755000076400001440000001273607473015724014071 0ustar mickeusers#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: chmodcmd="" else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 plucker-1.8/autogen.sh0100755000076400001440000000356207234525571014064 0ustar mickeusers#!/bin/sh # Run this to generate all the initial makefiles, etc. srcdir=`dirname $0` test -z "$srcdir" && srcdir=. ORIGDIR=`pwd` cd $srcdir PROJECT=Plucker TEST_TYPE=-d FILE=viewer DIE=0 (autoconf --version) < /dev/null > /dev/null 2>&1 || { echo echo "You must have autoconf installed to compile $PROJECT." echo "Download the appropriate package for your distribution," echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" DIE=1 } if test "$DIE" -eq 1; then exit 1 fi test $TEST_TYPE $FILE || { echo "You must run this script in the top-level $PROJECT directory" exit 1 } if test -z "$*"; then echo "I am going to run ./configure with no arguments - if you wish " echo "to pass any to it, please specify them on the $0 command line." echo "" fi case $CC in *xlc | *xlc\ * | *lcc | *lcc\ *) am_opt=--include-deps;; esac if test -z "$ACLOCAL_FLAGS"; then # acdir=`aclocal --print-ac-dir` # m4list="plucker.m4 gettext.m4" for file in $m4list do if [ ! -f "$acdir/$file" ]; then echo "WARNING: aclocal's directory is $acdir, but..." echo " no file $acdir/$file" echo " You may see fatal macro warnings below." echo " If these files are installed in /some/dir, set the ACLOCAL_FLAGS " echo " environment variable to \"-I /some/dir\", or install" echo " $acdir/$file." echo "" fi done fi aclocal $ACLOCAL_FLAGS # optionally feature autoheader if grep AM_CONFIG_HEADER configure.in >/dev/null ; then (autoheader --version) < /dev/null > /dev/null 2>&1 && autoheader fi autoconf cd $ORIGDIR $srcdir/configure --enable-maintainer-mode "$@" echo echo "Now type 'make' to compile $PROJECT." plucker-1.8/mkinstalldirs0100755000076400001440000000132707142776547014677 0ustar mickeusers#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain # $Id: mkinstalldirs,v 1.1 2000/08/05 11:41:27 nordstrom Exp $ errstatus=0 for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr fi fi pathcomp="$pathcomp/" done done exit $errstatus # mkinstalldirs ends here plucker-1.8/Makefile.in0100644000076400001440000001177707742232271014133 0ustar mickeusers# # $Id: Makefile.in,v 1.36 2003/10/12 11:02:17 nordstrom Exp $ # SHELL = @SHELL@ srcdir = @srcdir@ VPATH = @srcdir@ DESTDIR = DOCS_DIR = docs PARSER_DIR = parser UNIX_DIR = unix VIEWER_DIR = viewer TOOLS_DIR = tools DESKTOP_DIR = plucker_desktop UNPLUCK_DIR = $(TOOLS_DIR)/unpluck EXPLODE_DIR = $(TOOLS_DIR)/explode GTKVIEWER_DIR = viewer-GTK+2-POSIX BINDIR = $(DESTDIR)@bindir@ DOCDIR = $(DESTDIR)@DOCDIR@ DATADIR = $(DESTDIR)@PLUCKERDIR@ BUILD_PRC = @BUILD_PRC@ BUILD_MANUAL = @BUILD_MANUAL@ BUILD_DESKTOP = @BUILD_DESKTOP@ BUILD_UNPLUCK = @BUILD_UNPLUCK@ BUILD_EXPLODE = @BUILD_EXPLODE@ BUILD_GTKVIEWER = @BUILD_GTKVIEWER@ MKINSTALLDIRS = ./mkinstalldirs AUTOCONF = @AUTOCONF@ all: palmos_client pyplucker manual pluck_comics plucker-desktop unpluck explode gtkviewer Makefile: Makefile.in config.status CONFIG_FILES=$@ $(SHELL) ./config.status config.status: configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck configure: configure.in $(CONFIGURE_DEPENDENCIES) $(AUTOCONF) palmos_client: @if test "$(BUILD_PRC)" != "no"; then \ cd $(VIEWER_DIR) ; $(MAKE); \ fi pyplucker: cd $(PARSER_DIR) ; $(MAKE) $@; manual: @if test "$(BUILD_MANUAL)" != "no"; then \ cd $(DOCS_DIR) ; $(MAKE); \ fi pluck_comics: cd $(TOOLS_DIR) ; $(MAKE) $@ plucker-desktop: @if test "$(BUILD_DESKTOP)" != "no"; then \ cd $(DESKTOP_DIR) ; $(MAKE) $@ ; \ fi unpluck: @if test "$(BUILD_UNPLUCK)" != "no"; then \ cd $(UNPLUCK_DIR) ; $(MAKE) all ; \ fi explode: @if test "$(BUILD_EXPLODE)" != "no"; then \ cd $(EXPLODE_DIR) ; $(MAKE) all ; \ fi gtkviewer: @if test "$(BUILD_GTKVIEWER)" != "no"; then \ cd $(GTKVIEWER_DIR) ; $(MAKE) all ; \ fi install: install-palmos_client install-manual install-data install-pyplucker install-pluck_comics install-plucker-desktop install-unpluck install-explode install-gtkviewer install-palmos_client: palmos_client $(MKINSTALLDIRS) $(DATADIR)/palm -cp $(VIEWER_DIR)/*.prc $(DATADIR)/palm install-manual: manual cd $(DOCS_DIR) ; $(MAKE) install install-data: $(MKINSTALLDIRS) $(BINDIR) cp $(UNIX_DIR)/setup.py $(BINDIR)/plucker-setup ; chmod 755 $(BINDIR)/plucker-setup $(MKINSTALLDIRS) $(DOCDIR) cp AUTHORS BUGREPORT COPYING CREDITS ChangeLog FAQ NEWS README REQUIREMENTS TODO $(DOCDIR) cd $(PARSER_DIR) ; $(MAKE) $@ install-pyplucker: pyplucker cd $(PARSER_DIR) ; $(MAKE) $@ install-pluck_comics: pluck_comics cd $(TOOLS_DIR) ; $(MAKE) install-pluck_comics install-plucker-desktop: plucker-desktop @if test "$(BUILD_DESKTOP)" != "no"; then \ cd $(DESKTOP_DIR) ; $(MAKE) install \ fi install-unpluck: unpluck @if test "$(BUILD_UNPLUCK)" != "no"; then \ cd $(UNPLUCK_DIR) ; $(MAKE) install ; \ fi install-explode: explode @if test "$(BUILD_EXPLODE)" != "no"; then \ cd $(EXPLODE_DIR) ; $(MAKE) install ; \ fi install-gtkviewer: gtkviewer @if test "$(BUILD_GTKVIEWER)" != "no"; then \ cd $(GTKVIEWER_DIR) ; $(MAKE) install ; \ fi clean-recursive: @if test "$(BUILD_MANUAL)" != "no"; then \ cd $(DOCS_DIR) ; $(MAKE) clean ; \ fi cd $(PARSER_DIR) ; $(MAKE) clean @if test "$(BUILD_PRC)" != "no"; then \ cd $(VIEWER_DIR) ; $(MAKE) clean ; \ fi cd $(TOOLS_DIR) ; $(MAKE) clean @if test "$(BUILD_DESKTOP)" != "no"; then \ cd $(DESKTOP_DIR) ; $(MAKE) clean ; \ fi @if test "$(BUILD_GTKVIEWER)" != "no"; then \ cd $(GTKVIEWER_DIR) ; $(MAKE) clean ; \ fi distclean-recursive: @if test "$(BUILD_MANUAL)" != "no"; then \ cd $(DOCS_DIR) ; $(MAKE) distclean ; \ fi cd $(PARSER_DIR) ; $(MAKE) distclean @if test "$(BUILD_PRC)" != "no"; then \ cd $(VIEWER_DIR) ; $(MAKE) distclean ; \ fi cd $(TOOLS_DIR) ; $(MAKE) distclean @if test "$(BUILD_DESKTOP)" != "no"; then \ cd $(DESKTOP_DIR) ; $(MAKE) distclean ; \ fi @if test "$(BUILD_GTKVIEWER)" != "no"; then \ cd $(GTKVIEWER_DIR) ; $(MAKE) distclean ; \ fi cd $(UNIX_DIR) ; rm -f setup.py maintainer-clean-recursive: @if test "$(BUILD_MANUAL)" != "no"; then \ cd $(DOCS_DIR) ; $(MAKE) maintainer-clean ; \ fi cd $(PARSER_DIR) ; $(MAKE) maintainer-clean @if test "$(BUILD_PRC)" != "no"; then \ cd $(VIEWER_DIR) ; $(MAKE) maintainer-clean ; \ fi cd $(TOOLS_DIR) ; $(MAKE) maintainer-clean @if test "$(BUILD_DESKTOP)" != "no"; then \ cd $(DESKTOP_DIR) ; $(MAKE) maintainer-clean ; \ fi @if test "$(BUILD_GTKVIEWER)" != "no"; then \ cd $(GTKVIEWER_DIR) ; $(MAKE) maintainer-clean ; \ fi cd $(UNIX_DIR) ; rm -f setup.py clean: clean-recursive distclean: clean distclean-recursive rm -f Makefile config.* rm -fr autom4te.cache maintainer-clean: distclean maintainer-clean-recursive @echo "------------------------------------------------------------" @echo "This command is intended for maintainers to use..." @echo "it deletes files that may require special tools to rebuild." @echo "------------------------------------------------------------" plucker-1.8/parser/0040755000076400001440000000000010052675407013350 5ustar mickeusersplucker-1.8/parser/perl/0040755000076400001440000000000010052664565014315 5ustar mickeusersplucker-1.8/parser/perl/modules/0040755000076400001440000000000010052664565015765 5ustar mickeusersplucker-1.8/parser/perl/modules/Pilot.pm0100644000076400001440000006105406751113053017405 0ustar mickeusers # Pilot.pm: Interface pilot-link library with Perl. # # Copyright (C) 1997, 1998, Kenneth Albanowski # # This is free software, licensed under either the GNU Library Public # License V2, or the same terms as Perl itself, at your choice. See the file # COPYING.LIB for details on the GNU LGPL, and Artistic for information on # Perl's Artistic License. package PDA::Pilot; require Exporter; require DynaLoader; require AutoLoader; @ISA = qw(Exporter DynaLoader); # Items to export into callers namespace by default. Note: do not export # names by default without a very good reason. Use EXPORT_OK instead. # Do not simply export all your public functions/methods/constants. @EXPORT = qw( PI_AF_SLP PI_PF_LOOP PI_PF_PADP PI_PF_SLP PI_PilotSocketConsole PI_PilotSocketDLP PI_PilotSocketDebugger PI_PilotSocketRemoteUI PI_SOCK_DGRAM PI_SOCK_RAW PI_SOCK_SEQPACKET PI_SOCK_STREAM dlpOpenRead dlpOpenWrite dlpOpenExclusive dlpOpenSecret dlpOpenReadWrite dlpEndCodeNormal dlpEndCodeOutOfMemory dlpEndCodeUserCan dlpEndCodeOther dlpRecAttrDeleted dlpRecAttrDirty dlpRecAttrBusy dlpRecAttrSecret dlpRecAttrArchived dlpDBFlagResource dlpDBFlagReadOnly dlpDBFlagAppInfoDirty dlpDBFlagBackup dlpDBFlagOpen dlpDBFlagNewer dlpDBFlagReset dlpDBListRAM dlpDBListROM ); # Other items we are prepared to export if requested @EXPORT_OK = qw( CompareTm ); sub AUTOLOAD { # This AUTOLOAD is used to 'autoload' constants from the constant() # XS function. If a constant is not found then control is passed # to the AUTOLOAD in AutoLoader. # NOTE: THIS AUTOLOAD FUNCTION IS FLAWED (but is the best we can do for now). # Avoid old-style ``&CONST'' usage. Either remove the ``&'' or add ``()''. if (@_ > 0) { $AutoLoader::AUTOLOAD = $AUTOLOAD; goto &AutoLoader::AUTOLOAD; } local($constname); ($constname = $AUTOLOAD) =~ s/.*:://; $val = constant($constname, @_ ? $_[0] : 0); if ($! != 0) { if ($! =~ /Invalid/) { $AutoLoader::AUTOLOAD = $AUTOLOAD; goto &AutoLoader::AUTOLOAD; } else { ($pack,$file,$line) = caller; die "Your vendor has not defined PDA::Pilot macro $constname, used at $file line $line. "; } } eval "sub $AUTOLOAD { $val }"; goto &$AUTOLOAD; } bootstrap PDA::Pilot; package PDA::Pilot::Block; # Generic functions for "blocks", i.e., chunks of data from a Pilot. sub new { my($self,$data) = @_; $self = bless {}, (ref($self) || $self); if (defined($data)) { $self->Unpack($data); } else { $self->Fill(); } return $self; } sub Unpack { # Translate a "packed" block of binary data into a decent Perl representation my($self,$data) = @_; $self->{raw} = $data; } sub Pack { # Translate a Perl representation of a data block into a string of binary data my($self) = @_; return $self->{raw}; } sub Raw { # Just copy the "raw" item straight through my($self) = @_; return $self->{raw}; } sub Fill { # Fill in a block with default Perl data } # Copy a block sub Clone { my($self) = @_; my($k,$v); my($new) = bless {}, ref($_); for (($k,$v) = each %$self) { $new->{$k} = $v } $new; } package PDA::Pilot::Record; # A class to represent generic database records @ISA = qw(PDA::Pilot::Block); sub new { my($self,$data,$id,$attr,$cat,$index) = @_; $index = 0 unless defined($index); $id = 0 unless defined($id); $attr = 0 unless defined($attr); $cat = "" unless defined($cat); $self = bless { "index" => $index, id => $id, deleted => !!($attr & 0x80), modified => !!($attr & 0x40), busy => !!($attr & 0x20), secret => !!($attr & 0x10), archived => !!($attr & 0x08), category => $cat}, (ref($self) || $self); if (defined($data)) { $self->Unpack($data); } else { $self->Fill(); } return $self; } package PDA::Pilot::Resource; # A class to represent generic database resources @ISA = qw(PDA::Pilot::Block); sub new { my($self,$data,$index,$type,$id) = @_; $self = bless { "index" => $index, type => $type, id => $id}, (ref($self) || $self); if (defined($data)) { $self->Unpack($data); } else { $self->Fill(); } return $self; } package PDA::Pilot::AppBlock; # A class to represent generic application-information blocks @ISA = qw(PDA::Pilot::Block); package PDA::Pilot::SortBlock; # A class to represent generic sort-information blocks @ISA = qw(PDA::Pilot::Block); package PDA::Pilot::Pref; # A class to represent generic preference blocks @ISA = qw(PDA::Pilot::Block); sub new { my($self,$data,$creator,$id,$version,$backup) = @_; $self = bless { creator => $creator, id => $id, version => $version, backup => $backup}, (ref($self) || $self); if (defined($data)) { $self->Unpack($data); } else { $self->Fill(); } return $self; } package PDA::Pilot::MemoRecord; # A class to represent records of the Memo application @ISA = qw(PDA::Pilot::Record); sub Pack { my($self) = @_; return $self->{raw} = PDA::Pilot::Memo::Pack($self); } sub Unpack { my($self, $data) = @_; $self->{raw} = $data; PDA::Pilot::Memo::Unpack($self); } package PDA::Pilot::MemoAppBlock; # A class to represent records of the Memo application @ISA = qw(PDA::Pilot::AppBlock); sub Pack { my($self) = @_; return PDA::Pilot::Memo::PackAppBlock($self); } sub Unpack { my($self, $data) = @_; $self->{raw} = $data; PDA::Pilot::Memo::UnpackAppBlock($self); } package PDA::Pilot::ToDoRecord; # A class to represent records of the ToDo application @ISA = qw(PDA::Pilot::Record); sub Pack { my($self) = @_; return $self->{raw} = PDA::Pilot::ToDo::Pack($self); } sub Unpack { my($self, $data) = @_; $self->{raw} = $data; PDA::Pilot::ToDo::Unpack($self); } package PDA::Pilot::ToDoAppBlock; # A class to represent the app block of the ToDo application @ISA = qw(PDA::Pilot::AppBlock); sub Pack { my($self) = @_; return PDA::Pilot::ToDo::PackAppBlock($self); } sub Unpack { my($self, $data) = @_; $self->{raw} = $data; PDA::Pilot::ToDo::UnpackAppBlock($self); } package PDA::Pilot::AddressRecord; # A class to represent records of the Address application @ISA = qw(PDA::Pilot::Record); sub Pack { my($self) = @_; return $self->{raw} = PDA::Pilot::Address::Pack($self); } sub Unpack { my($self, $data) = @_; $self->{raw} = $data; PDA::Pilot::Address::Unpack($self); } package PDA::Pilot::AddressAppBlock; # A class to represent the app block of the Address application @ISA = qw(PDA::Pilot::AppBlock); sub Pack { my($self) = @_; return PDA::Pilot::Address::PackAppBlock($self); } sub Unpack { my($self, $data) = @_; $self->{raw} = $data; PDA::Pilot::Address::UnpackAppBlock($self); } package PDA::Pilot::AppointmentRecord; # A class to represent records of the Appointment application @ISA = qw(PDA::Pilot::Record); sub Pack { my($self) = @_; return PDA::Pilot::Appointment::Pack($self); } sub Unpack { my($self, $data) = @_; $self->{raw} = $data; PDA::Pilot::Appointment::Unpack($self); } package PDA::Pilot::AppointmentAppBlock; # A class to represent the app block of the Appointment application @ISA = qw(PDA::Pilot::AppBlock); sub Pack { my($self) = @_; return PDA::Pilot::Appointment::PackAppBlock($self); } sub Unpack { my($self, $data) = @_; $self->{raw} = $data; PDA::Pilot::Appointment::UnpackAppBlock($self); } package PDA::Pilot::MailRecord; # A class to represent records of the Mail application @ISA = qw(PDA::Pilot::Record); sub Pack { my($self) = @_; return PDA::Pilot::Mail::Pack($self); } sub Unpack { my($self, $data) = @_; $self->{raw} = $data; PDA::Pilot::Mail::Unpack($self); } package PDA::Pilot::MailAppBlock; # A class to represent the app block of the Mail application @ISA = qw(PDA::Pilot::AppBlock); sub Pack { my($self) = @_; return PDA::Pilot::Mail::PackAppBlock($self); } sub Unpack { my($self, $data) = @_; $self->{raw} = $data; PDA::Pilot::Mail::UnpackAppBlock($self); } package PDA::Pilot::MailSyncPref; # A class to represent the sync pref of the Mail application @ISA = qw(PDA::Pilot::Pref); sub Pack { my($self) = @_; return PDA::Pilot::Mail::PackSyncPref($self); } sub Unpack { my($self, $data) = @_; $self->{raw} = $data; PDA::Pilot::Mail::UnpackSyncPref($self); } package PDA::Pilot::MailSignaturePref; # A class to represent the signature pref of the Mail application @ISA = qw(PDA::Pilot::Pref); sub Pack { my($self) = @_; return PDA::Pilot::Mail::PackSignaturePref($self); } sub Unpack { my($self, $data) = @_; $self->{raw} = $data; PDA::Pilot::Mail::UnpackSignaturePref($self); } package PDA::Pilot::ExpenseRecord; # A class to represent records of the Expense application @ISA = qw(PDA::Pilot::Record); sub Pack { my($self) = @_; return PDA::Pilot::Expense::Pack($self); } sub Unpack { my($self, $data) = @_; $self->{raw} = $data; PDA::Pilot::Expense::Unpack($self); } package PDA::Pilot::ExpenseAppBlock; # A class to represent the app block of the Expense application @ISA = qw(PDA::Pilot::AppBlock); sub Pack { my($self) = @_; return PDA::Pilot::Expense::PackAppBlock($self); } sub Unpack { my($self, $data) = @_; $self->{raw} = $data; PDA::Pilot::Expense::UnpackAppBlock($self); } package PDA::Pilot::ExpensePref; # A class to represent the pref of the Expense application @ISA = qw(PDA::Pilot::Pref); sub Pack { my($self) = @_; return PDA::Pilot::Expense::PackPref($self); } sub Unpack { my($self, $data) = @_; $self->{raw} = $data; PDA::Pilot::Expense::UnpackPref($self); } package PDA::Pilot::Database; # A class to specify which classes are used for generic database entries sub record { shift @_; PDA::Pilot::Record->new(@_) } sub resource { shift @_; PDA::Pilot::Resource->new(@_) } sub pref { shift @_; PDA::Pilot::Pref->new(@_) } sub appblock { shift @_; PDA::Pilot::AppBlock->new(@_) } sub sortblock { shift @_; PDA::Pilot::SortBlock->new(@_) } package PDA::Pilot::MemoDatabase; # A class to specify which classes are used for Memo database entries @ISA=qw(PDA::Pilot::Database); sub record { shift @_; PDA::Pilot::MemoRecord->new(@_) } sub appblock { shift @_; PDA::Pilot::MemoAppBlock->new(@_) } sub creator { 'memo' } sub dbname { 'MemoDB' } package PDA::Pilot::ToDoDatabase; @ISA=qw(PDA::Pilot::Database); sub record { shift @_; PDA::Pilot::ToDoRecord->new(@_) } sub appblock { shift @_; PDA::Pilot::ToDoAppBlock->new(@_) } sub creator { 'todo' } sub dbname { 'ToDoDB' } package PDA::Pilot::AppointmentDatabase; @ISA=qw(PDA::Pilot::Database); sub record { shift @_; PDA::Pilot::AppointmentRecord->new(@_) } sub appblock { shift @_; PDA::Pilot::AppointmentAppBlock->new(@_) } sub creator { 'date' } sub dbname { 'DatebookDB' } package PDA::Pilot::AddressDatabase; @ISA=qw(PDA::Pilot::Database); sub record { shift @_; PDA::Pilot::AddressRecord->new(@_) } sub appblock { shift @_; PDA::Pilot::AddressAppBlock->new(@_) } sub creator { 'addr' } sub dbname { 'AddressDB' } package PDA::Pilot::MailDatabase; @ISA=qw(PDA::Pilot::Database); sub record { shift @_; PDA::Pilot::MailRecord->new(@_) } sub appblock { shift @_; PDA::Pilot::MailAppBlock->new(@_) } sub pref { shift @_; my($data,$creator,$id) = @_; if (($id == 1) || ($id == 2)) { PDA::Pilot::MailSyncPref->new(@_); } elsif ($id == 3) { PDA::Pilot::MailSignaturePref->new(@_); } else { PDA::Pilot::Database->pref(@_); } } sub creator { 'mail' } sub dbname { 'MailDB' } package PDA::Pilot::ExpenseDatabase; @ISA=qw(PDA::Pilot::Database); sub record { shift @_; PDA::Pilot::ExpenseRecord->new(@_) } sub appblock { shift @_; PDA::Pilot::ExpenseAppBlock->new(@_) } sub pref { shift @_; my($data,$creator,$id) = @_; if ($id == 1) { PDA::Pilot::ExpensePref->new(@_); } else { PDA::Pilot::Database->pref(@_); } } sub creator { 'exps' } sub dbname { 'ExpenseDB' } package PDA::Pilot; %DBClasses = ( MemoDB => 'PDA::Pilot::MemoDatabase', ToDoDB => 'PDA::Pilot::ToDoDatabase', AddressDB => 'PDA::Pilot::AddressDatabase', DatebookDB => 'PDA::Pilot::AppointmentDatabase', MailDB => 'PDA::Pilot::MailDatabase', ExpenseDB => 'PDA::Pilot::ExpenseDatabase' ); %PrefClasses = ( memo => 'PDA::Pilot::MemoDatabase', todo => 'PDA::Pilot::ToDoDatabase', mail => 'PDA::Pilot::MailDatabase', date => 'PDA::Pilot::AppointmentDatabase', addr => 'PDA::Pilot::AddressDatabase', exps => 'PDA::Pilot::ExpenseDatabase' ); # Default classes $DBClasses{''} = 'PDA::Pilot::Database'; $PrefClasses{''} = 'PDA::Pilot::Database'; sub CompareTm { my(@a) = @{$_[0]}; my(@b) = @{$_[1]}; return ($a[5] <=> $b[5]) || ($a[4] <=> $b[4]) || ($a[3] <=> $b[3]) || ($a[2] <=> $b[2]) || ($a[1] <=> $b[1]) || ($a[0] <=> $b[0]); } # Autoload methods go after __END__, and are processed by the autosplit program. 1; __END__ =head1 Commands include: B This information is out of date, and potentially quite misleading. =over 4 =item PDA::Pilot::Appointment::Unpack(buffer) Returns hash reference containing appointment (datebook entry) in a usable format, given a record from a .pdb file or a Pilot database. =item PDA::Pilot::Appointment::Pack(buffer) Given a hash reference in the form that the previous call generates, returns a single string suitable for storing in a Pilot's database. =item PDA::Pilot::Appointment::UnpackAppInfo(buffer) Returns hash reference containing appointment (datebook entry) in a usable format, given the AppInfo record from a .pdb file or a Pilot database. =item PDA::Pilot::Appointment::PackAppInfo(buffer) Given a hash reference in the form that the previous call generates, returns a single string suitable for storing in a Pilot's database AppInfo block. =item PDA::Pilot::Memo::Unpack(buffer) Returns hash reference containing appointment (datebook entry) in a usable format, given a record from a .pdb file or a Pilot database. =item PDA::Pilot::Memo::Pack(buffer) Given a hash reference in the form that the previous call generates, returns a single string suitable for storing in a Pilot's database. =item PDA::Pilot::Memo::UnpackAppInfo(buffer) Returns hash reference containing appointment (datebook entry) in a usable format, given the AppInfo record from a .pdb file or a Pilot database. =item PDA::Pilot::Memo::PackAppInfo(buffer) Given a hash reference in the form that the previous call generates, returns a single string suitable for storing in a Pilot's database AppInfo block. =item PDA::Pilot::ToDo::Unpack(buffer) Returns hash reference containing appointment (datebook entry) in a usable format, given a record from a .pdb file or a Pilot database. =item PDA::Pilot::ToDo::Pack(buffer) Given a hash reference in the form that the previous call generates, returns a single string suitable for storing in a Pilot's database. =item PDA::Pilot::ToDo::UnpackAppInfo(buffer) Returns hash reference containing appointment (datebook entry) in a usable format, given the AppInfo record from a .pdb file or a Pilot database. =item PDA::Pilot::ToDo::PackAppInfo(buffer) Given a hash reference in the form that the previous call generates, returns a single string suitable for storing in a Pilot's database AppInfo block. =item PDA::Pilot::Address::Unpack(buffer) Returns hash reference containing appointment (datebook entry) in a usable format, given a record from a .pdb file or a Pilot database. =item PDA::Pilot::Address::Pack(buffer) Given a hash reference in the form that the previous call generates, returns a single string suitable for storing in a Pilot's database. =item PDA::Pilot::Address::UnpackAppInfo(buffer) Returns hash reference containing appointment (datebook entry) in a usable format, given the AppInfo record from a .pdb file or a Pilot database. =item PDA::Pilot::Address::PackAppInfo(buffer) Given a hash reference in the form that the previous call generates, returns a single string suitable for storing in a Pilot's database AppInfo block. =item PDA::Pilot::Mail::Unpack(buffer) Returns hash reference containing appointment (datebook entry) in a usable format, given a record from a .pdb file or a Pilot database. =item PDA::Pilot::Mail::Pack(buffer) Given a hash reference in the form that the previous call generates, returns a single string suitable for storing in a Pilot's database. =item PDA::Pilot::Mail::UnpackAppInfo(buffer) Returns hash reference containing appointment (datebook entry) in a usable format, given the AppInfo record from a .pdb file or a Pilot database. =item PDA::Pilot::Mail::PackAppInfo(buffer) Given a hash reference in the form that the previous call generates, returns a single string suitable for storing in a Pilot's database AppInfo block. =item PDA::Pilot::Socket::socket(domain, type, protocol) Same as pi-link routine called pi_socket. =item PDA::Pilot::Socket::close(socket) Same as pi-link routine called pi_close. =item PDA::Pilot::Socket::write(socket, string) Same as pi-link routine called pi_write. =item PDA::Pilot::Socket::read(socket, len) Same as pi-link routine called pi_write (returns read data as result.) =item PDA::Pilot::Socket::listen(socket, backlog) Same as pi-link routine called pi_listen. =item PDA::Pilot::Socket::bind(socket, sockaddr) Same as pi-link routine called pi_bind. Sockaddr may either be a packed string containing a pi_sockaddr structure, or a hash reference containing "device", "family", and "port" keys. =item PDA::Pilot::Socket::accept(socket) Same as pi-link routine called pi_accept. If connection is successfull, returns reference to hash containing remote address, as described above. If failed, returns undef. =item PDA::Pilot::DLP::errno() Returns last DLP error, resetting error to zero. =item PDA::Pilot::DLP::GetSysDateTime(socket) Same as DLP call dlp_GetSysDateTime. If successfull, returns time, otherwise returns undef. =item PDA::Pilot::DLP::SetSysDateTime(socket, time) Same as DLP call dlp_SetSysDateTime. time must be a time_t value. =item PDA::Pilot::DLP::ReadSysInfo(socket) Same as DLP call dlp_ReadSysInfo. If successfull, returns reference to hash containing system information. =item PDA::Pilot::DLP::ReadStorageInfo(socket, cardno) Same as DLP call dlp_ReadStorageInfo. If successfull, returns reference to hash containing information on given memory card. =item PDA::Pilot::DLP::ReadUserInfo(socket) Same as DLP call dlp_ReadUserInfo. If successfull, returns reference to hash containing information about user settings. =item PDA::Pilot::DLP::WriteUserInfo(socket, info) Same as DLP call dlp_WriteUserInfo. info must be a reference to a hash containing data similar to that returned by ReadUserInfo (Note: the password can not be set through this call.) =item PDA::Pilot::DLP::OpenDB(socket, cardno, mode, name) Same as DLP call dlp_OpenDB. If successfull returns database handle, otherwise returns undef. =item PDA::Pilot::DLP::CloseDB(socket, handle) Same as DLP call dlp_CloseDB. =item PDA::Pilot::DLP::EndOfSync(socket, status) Same as DLP call dlp_EndOfSync. =item PDA::Pilot::DLP::AbortSync(socket) Same as DLP call dlp_AbortSync. =item PDA::Pilot::DLP::MoveCategory(socket, handle, fromcat, tocat) Same as DLP call dlp_MoveCategory. =item PDA::Pilot::DLP::ResetSystem(socket) Same as DLP call dlp_ResetSystem. =item PDA::Pilot::DLP::OpenConduit(socket) Same as DLP call dlp_OpenConduit. =item PDA::Pilot::DLP::AddSyncLogEntry(socket, message) Same as DLP call dlp_AddSyncLogEntry =item PDA::Pilot::DLP::CleanUpDatabase(socket, handle) Same as DLP call dlp_CleanUpDatabase. =item PDA::Pilot::DLP::ResetSyncFlags(socket, handle) Same as DLP call dlp_ResetSyncFlags. =item PDA::Pilot::DLP::ResetDBIndex(socket, handle) Same as DLP call dlp_ResetDBIndex. =item PDA::Pilot::DLP::ResetLastSyncPC(socket) Same as DLP call dlp_ResetLastSyncPC. =item PDA::Pilot::DLP::DeleteCategory(socket, handle, category) Same as DLP call dlp_DeleteCategory. =item PDA::Pilot::DLP::DeleteRecord(socket, handle, all, id) Same as DLP call dlp_DeleteRecord. =item PDA::Pilot::DLP::ReadDBList(socket, cardno, flags, start) Same as DLP call dlp_ReadDBList. If successfull, returns reference to hash containing DB information. If failed, returns undef. =item PDA::Pilot::DLP::FindDBInfo(socket, cardno, flags, name, type, creator) Same as DLP call dlp_FindDBInfo. If successfull, returns reference to hash containing DB information. If failed, returns undef. =item PDA::Pilot::DLP::ReadFeature(socket, creator, number) Same as DLP call dlp_ReadFeature. If successfull, returns feature value. If failed, returns undef. =item PDA::Pilot::DLP::ReadAppBlock(socket, handle) Same as DLP call dlp_ReadAppBlock. If successfull, returns app block. If failed, returns undef. =item PDA::Pilot::DLP::ReadSortBlock(socket, handle) Same as DLP call dlp_ReadSortBlock. If successfull, returns app block. If failed, returns undef. =item PDA::Pilot::DLP::WriteAppBlock(socket, handle, block) Same as DLP call dlp_WriteAppBlock. =item PDA::Pilot::DLP::WriteSortBlock(socket, handle, block) Same as DLP call dlp_WriteSortBlock. =item PDA::Pilot::DLP::ReadOpenDBInfo(socket, handle) Same as DLP call dlp_ReadOpenDBInfo. =item PDA::Pilot::DLP::ReadRecordByIndex(socket, handle, index) Same as DLP call dlp_ReadRecordByIndex. If call fails, it returns undef. Otherwise, in scalar context it returns the read record, in array it returns the record, id, index, attr, and category, in that order. =item PDA::Pilot::DLP::ReadRecordById(socket, handle, id) Same as DLP call dlp_ReadRecordById. If call fails, it returns undef. Otherwise, in scalar context it returns the read record, in array it returns the record, id, index, attr, and category, in that order. =item PDA::Pilot::DLP::ReadNextModifiedRec(socket, handle) Same as DLP call dlp_ReadNextModifiedRec. If call fails, it returns undef. Otherwise, in scalar context it returns the read record, in array it returns the record, id, index, attr, and category, in that order. =item PDA::Pilot::DLP::ReadNextRecInCategory(socket, handle, category) Same as DLP call dlp_ReadNextRecInCategory. If call fails, it returns undef. Otherwise, in scalar context it returns the read record, in array it returns the record, id, index, attr, and category, in that order. =item PDA::Pilot::DLP::ReadNextModifiedRecInCategory(socket, handle, category) Same as DLP call dlp_ReadNextModifiedRecInCategory. If call fails, it returns undef. Otherwise, in scalar context it returns the read record, in array it returns the record, id, index, attr, and category, in that order. =item PDA::Pilot::DLP::WriteRecord(socket, handle, record, id, attr, category) Same as DLP call dlp_WriteRecord. =item PDA::Pilot::DLP::ReadResourceByType(socket, handle, type, id) Same as DLP call dlp_ReadResourceByType. If call fails, it returns undef. Otherwise, in scalar context it returns the read record, in array it returns the record, type, id, and index, in that order. =item PDA::Pilot::DLP::ReadResourceByIndex(socket, handle, index) Same as DLP call dlp_ReadResourceByIndex. If call fails, it returns undef. Otherwise, in scalar context it returns the read record, in array it returns the record, type, id, and index, in that order. =item PDA::Pilot::DLP::WriteResource(socket, handle, record, type, id) Same as DLP call dlp_WriteResource. =item PDA::Pilot::DLP::DeleteResource(socket, handle, all, type, id) Same as DLP call dlp_DeleteResource. =item PDA::Pilot::DLP::CallApplication(socket, creator, type, action, data) Same as DLP call dlp_CallApplication. =item PDA::Pilot::File::open(name) Same as pi_file_open. Returns a PDA::Pilot::File object on success. =item PDA::Pilot::File::close(file) Same as pi_file_close. =item PDA::Pilot::File::get_app_info(file) Same as pi_file_get_app_info. =item PDA::Pilot::File::get_sort_info(file) Same as pi_file_get_sort_info. =item PDA::Pilot::File::get_entries(file) Same as pi_file_get_entries. =item PDA::Pilot::File::read_resource(file, index) Same as pi_file_read_resource. Returns (record, type, id, index). =item PDA::Pilot::File::read_record(file, index) Same as pi_file_read_record. Returns (record, id, index, attr, category). =item PDA::Pilot::File::read_record_by_id(file, type, id) Same as pi_file_read_record_by_id. Returns (record, id, index, attr, category). =item PDA::Pilot::File::create(name, info) Same as pi_file_create. Info is reference to hash containg dbinfo data. =item PDA::Pilot::File::get_info(file) Same as pi_file_get_info. =item PDA::Pilot::File::set_info(file, info) Same as pi_file_set_info. =item PDA::Pilot::File::set_app_info(file, data) Same as pi_file_set_app_info. =item PDA::Pilot::File::set_sort_info(file, data) Same as pi_file_set_sort_info. =item PDA::Pilot::File::append_resource(file, data, type, id) Same as pi_file_append_resource. =item PDA::Pilot::File::append_record(file, data, attr, category, id) Same as pi_file_append_record. =item PDA::Pilot::File::install(file, socket, cardno) Same as pi_file_install. =item PDA::Pilot::File::retrieve(file, socket, cardno) Same as pi_file_retrieve. =back =cut plucker-1.8/parser/perl/modules/Pilot.xs0100644000076400001440000026310106751113057017424 0ustar mickeusers /* Pilot.xs: Interface pilot-link library with Perl. * * Copyright (C) 1997, 1998, Kenneth Albanowski * * This is free software, licensed under either the GNU Library Public * License V2, or the same terms as Perl itself, at your choice. See the file * COPYING.LIB for details on the GNU LGPL, and Artistic for information on * Perl's Artistic License. */ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "patchlevel.h" /* Work around a bit of Perl Pollution */ #ifdef dirty #undef dirty #endif #include "pi-macros.h" #include "pi-file.h" #include "pi-datebook.h" #include "pi-memo.h" #include "pi-expense.h" #include "pi-address.h" #include "pi-todo.h" #include "pi-mail.h" #include "pi-socket.h" #include "pi-dlp.h" #include "pi-syspkt.h" typedef unsigned char * CPTR; static int not_here(s) char *s; { croak("%s not implemented on this architecture", s); return -1; } static double constant(name, arg) char *name; int arg; { errno = 0; switch (*name) { case 'A': break; case 'B': break; case 'C': break; case 'D': break; case 'E': break; case 'F': break; case 'G': break; case 'H': break; case 'I': break; case 'J': break; case 'K': break; case 'L': break; case 'M': break; case 'N': break; case 'O': break; case 'P': if (strEQ(name, "PI_AF_SLP")) #ifdef PI_AF_SLP return PI_AF_SLP; #else goto not_there; #endif if (strEQ(name, "PI_PF_LOOP")) #ifdef PI_PF_LOOP return PI_PF_LOOP; #else goto not_there; #endif if (strEQ(name, "PI_PF_PADP")) #ifdef PI_PF_PADP return PI_PF_PADP; #else goto not_there; #endif if (strEQ(name, "PI_PF_SLP")) #ifdef PI_PF_SLP return PI_PF_SLP; #else goto not_there; #endif if (strEQ(name, "PI_PilotSocketConsole")) #ifdef PI_PilotSocketConsole return PI_PilotSocketConsole; #else goto not_there; #endif if (strEQ(name, "PI_PilotSocketDLP")) #ifdef PI_PilotSocketDLP return PI_PilotSocketDLP; #else goto not_there; #endif if (strEQ(name, "PI_PilotSocketDebugger")) #ifdef PI_PilotSocketDebugger return PI_PilotSocketDebugger; #else goto not_there; #endif if (strEQ(name, "PI_PilotSocketRemoteUI")) #ifdef PI_PilotSocketRemoteUI return PI_PilotSocketRemoteUI; #else goto not_there; #endif if (strEQ(name, "PI_SOCK_DGRAM")) #ifdef PI_SOCK_DGRAM return PI_SOCK_DGRAM; #else goto not_there; #endif if (strEQ(name, "PI_SOCK_RAW")) #ifdef PI_SOCK_RAW return PI_SOCK_RAW; #else goto not_there; #endif if (strEQ(name, "PI_SOCK_SEQPACKET")) #ifdef PI_SOCK_SEQPACKET return PI_SOCK_SEQPACKET; #else goto not_there; #endif if (strEQ(name, "PI_SOCK_STREAM")) #ifdef PI_SOCK_STREAM return PI_SOCK_STREAM; #else goto not_there; #endif break; case 'Q': break; case 'R': break; case 'S': break; case 'T': break; case 'U': break; case 'V': break; case 'W': break; case 'X': break; case 'Y': break; case 'Z': break; case 'd': #define DoName(x) if (strEQ(name, STRINGIFY(x))) return x if (strlen(name)>3) { switch (name[3]) { case 'O': DoName(dlpOpenRead); DoName(dlpOpenWrite); DoName(dlpOpenExclusive); DoName(dlpOpenSecret); DoName(dlpOpenReadWrite); break; case 'E': DoName(dlpEndCodeNormal); DoName(dlpEndCodeOutOfMemory); DoName(dlpEndCodeUserCan); DoName(dlpEndCodeOther); break; case 'R': DoName(dlpRecAttrDeleted); DoName(dlpRecAttrDirty); DoName(dlpRecAttrBusy); DoName(dlpRecAttrSecret); DoName(dlpRecAttrArchived); break; case 'D': DoName(dlpDBFlagResource); DoName(dlpDBFlagReadOnly); DoName(dlpDBFlagAppInfoDirty); DoName(dlpDBFlagBackup); DoName(dlpDBFlagOpen); DoName(dlpDBFlagNewer); DoName(dlpDBFlagReset); DoName(dlpDBListRAM); DoName(dlpDBListROM); break; } } break; } errno = EINVAL; return 0; not_there: errno = ENOENT; return 0; } static char mybuf[0xffff]; static AV * tmtoav (struct tm * t) { AV * ret = newAV(); av_push(ret, newSViv(t->tm_sec)); av_push(ret, newSViv(t->tm_min)); av_push(ret, newSViv(t->tm_hour)); av_push(ret, newSViv(t->tm_mday)); av_push(ret, newSViv(t->tm_mon)); av_push(ret, newSViv(t->tm_year)); av_push(ret, newSViv(t->tm_wday)); av_push(ret, newSViv(t->tm_yday)); av_push(ret, newSViv(t->tm_isdst)); return ret; } struct tm * avtotm (AV * av, struct tm * t) { SV ** s; t->tm_sec = (s = av_fetch(av, 0, 0)) ? SvIV(*s) : 0; t->tm_min = (s = av_fetch(av, 1, 0)) ? SvIV(*s) : 0; t->tm_hour = (s = av_fetch(av, 2, 0)) ? SvIV(*s) : 0; t->tm_mday = (s = av_fetch(av, 3, 0)) ? SvIV(*s) : 0; t->tm_mon = (s = av_fetch(av, 4, 0)) ? SvIV(*s) : 0; t->tm_year = (s = av_fetch(av, 5, 0)) ? SvIV(*s) : 0; t->tm_wday= (s = av_fetch(av, 6, 0)) ? SvIV(*s) : 0; t->tm_yday= (s = av_fetch(av, 7, 0)) ? SvIV(*s) : 0; t->tm_isdst = (s = av_fetch(av, 8, 0)) ? SvIV(*s) : 0; return t; } #ifndef newRV_noinc static SV * rv; #define newRV_noinc(s) ((rv=newRV(s)), SvREFCNT_dec(s), rv) #endif #if (PATCHLEVEL < 3) || ((PATCHLEVEL == 3) && (SUBVERSION < 16)) #define sv_derived_from(x, y) sv_isobject((x)) #endif extern char * printlong _((unsigned long val)); extern unsigned long makelong _((char * c)); SV * newSVChar4 _((unsigned long arg)); unsigned long SvChar4 _((SV *arg)); typedef struct { int errnop; struct pi_file * pf; SV * Class; } PDA__Pilot__File; typedef struct DLP { int errnop; int socket; } PDA__Pilot__DLP; typedef struct DLPDB { SV * connection; int socket; int handle; int errnop; SV * dbname; int dbmode; int dbcard; SV * Class; } PDA__Pilot__DLP__DB; /*typedef PDA__Pilot__DLP__DB PDA__Pilot__DLP__ResourceDB; typedef PDA__Pilot__DLP__DB PDA__Pilot__DLP__RecordDB;*/ typedef struct DBInfo DBInfo; typedef struct PilotUser UserInfo; typedef unsigned long Char4; typedef int Result; SV * newSVChar4(arg) unsigned long arg; { char * c = printlong(arg); if( (isalpha(c[0]) || (c[0] == ' ') || (c[0] == '_')) && (isalpha(c[1]) || (c[1] == ' ') || (c[0] == '_')) && (isalpha(c[2]) || (c[2] == ' ') || (c[0] == '_')) && (isalpha(c[3]) || (c[3] == ' ') || (c[0] == '_'))) return newSVpv(c,4); else return newSViv(arg); } unsigned long SvChar4(arg) SV * arg; { if (SvIOKp(arg)) return SvIV(arg); else { STRLEN len; char * c = SvPV(arg, len); if (len != 4) croak("Char4 argument a string that isn't four bytes long"); return makelong(c); } } #define pack_dbinfo(arg, var, failure) \ { \ if (failure < 0) { \ arg = &sv_undef; \ self->errnop = failure; \ } else { \ HV * i = newHV(); \ hv_store(i, "more", 4, newSViv(var.more), 0); \ hv_store(i, "flagReadOnly", 12, newSViv((var.flags & dlpDBFlagReadOnly)!=0), 0); \ hv_store(i, "flagResource", 12, newSViv((var.flags & dlpDBFlagResource)!=0), 0); \ hv_store(i, "flagBackup", 10, newSViv((var.flags & dlpDBFlagBackup)!=0), 0); \ hv_store(i, "flagOpen", 8, newSViv((var.flags & dlpDBFlagOpen)!=0), 0); \ hv_store(i, "flagAppInfoDirty", 16, newSViv((var.flags & dlpDBFlagAppInfoDirty)!=0), 0);\ hv_store(i, "flagNewer", 9, newSViv((var.flags & dlpDBFlagNewer)!=0), 0); \ hv_store(i, "flagReset", 9, newSViv((var.flags & dlpDBFlagReset)!=0), 0); \ hv_store(i, "flagExcludeFromSync", 19, newSViv((var.miscFlags & dlpDBMiscFlagExcludeFromSync)!=0), 0); \ hv_store(i, "type", 4, newSVChar4(var.type), 0); \ hv_store(i, "creator", 7, newSVChar4(var.creator), 0); \ hv_store(i, "version", 7, newSViv(var.version), 0); \ hv_store(i, "modnum", 6, newSViv(var.modnum), 0); \ hv_store(i, "index", 5, newSViv(var.index), 0); \ hv_store(i, "createDate", 10, newSViv(var.createDate), 0); \ hv_store(i, "modifyDate", 10, newSViv(var.modifyDate), 0); \ hv_store(i, "backupDate", 10, newSViv(var.backupDate), 0); \ hv_store(i, "name", 4, newSVpv(var.name, 0), 0); \ arg = newRV_noinc((SV*)i); \ } \ } #define unpack_dbinfo(arg, var) \ if ((SvTYPE(arg) == SVt_RV) && (SvTYPE(SvRV(arg))==SVt_PVHV)) { \ HV * i = (HV*)SvRV(arg); \ SV ** s; \ var.more = (s = hv_fetch(i, "more", 4, 0)) ? SvIV(*s) : 0; \ var.flags = \ (((s = hv_fetch(i, "flagReadOnly", 12, 0)) && SvTRUE(*s)) ? dlpDBFlagReadOnly : 0)| \ (((s = hv_fetch(i, "flagResource", 12, 0)) && SvTRUE(*s)) ? dlpDBFlagResource : 0)| \ (((s = hv_fetch(i, "flagBackup", 10, 0)) && SvTRUE(*s)) ? dlpDBFlagBackup : 0)| \ (((s = hv_fetch(i, "flagOpen", 8, 0)) && SvTRUE(*s)) ? dlpDBFlagOpen : 0) | \ (((s = hv_fetch(i, "flagAppInfoDirty", 16, 0)) && SvTRUE(*s)) ? dlpDBFlagAppInfoDirty : 0) |\ (((s = hv_fetch(i, "flagNewer", 9, 0)) && SvTRUE(*s)) ? dlpDBFlagNewer : 0) | \ (((s = hv_fetch(i, "flagReset", 9, 0)) && SvTRUE(*s)) ? dlpDBFlagReset : 0) | \ 0;\ var.miscFlags = \ (((s = hv_fetch(i, "flagExcludeFromSync", 19, 0)) && SvTRUE(*s)) ? dlpDBMiscFlagExcludeFromSync : 0); \ var.type = (s = hv_fetch(i, "type", 4, 0)) ? SvChar4(*s) : 0; \ var.creator = (s = hv_fetch(i, "creator", 7, 0)) ? SvChar4(*s) : 0; \ var.version = (s = hv_fetch(i, "version", 7, 0)) ? SvIV(*s) : 0; \ var.modnum = (s = hv_fetch(i, "modnum", 6, 0)) ? SvIV(*s) : 0; \ var.index = (s = hv_fetch(i, "index", 5, 0)) ? SvIV(*s) : 0; \ var.createDate = (s = hv_fetch(i, "creatDate", 10, 0)) ? SvIV(*s) : 0; \ var.modifyDate = (s = hv_fetch(i, "modifyDate", 10, 0)) ? SvIV(*s) : 0; \ var.backupDate = (s = hv_fetch(i, "backupDate", 10, 0)) ? SvIV(*s) : 0; \ if ((s = hv_fetch(i, "name", 4, 0)) ? SvPV(*s,na) : 0) \ strcpy(var.name, SvPV(*s, na)); \ } else {\ croak("argument is not a hash reference"); \ } #define pack_userinfo(arg, var, failure) \ { \ if (failure < 0) { \ arg = &sv_undef; \ self->errnop = failure;\ } else { \ HV * i = newHV(); \ hv_store(i, "userID", 6, newSViv(var.userID), 0); \ hv_store(i, "viewerID", 8, newSViv(var.viewerID), 0); \ hv_store(i, "lastSyncPC", 10, newSViv(var.lastSyncPC), 0); \ hv_store(i, "successfulSyncDate", 18, newSViv(var.successfulSyncDate), 0); \ hv_store(i, "lastSyncDate", 12, newSViv(var.lastSyncDate), 0); \ hv_store(i, "name", 4, newSVpv(var.username,0), 0); \ hv_store(i, "password", 8, newSVpv(var.password,var.passwordLength), 0); \ arg = newRV_noinc((SV*)i); \ } \ } #define unpack_userinfo(arg, var) \ if ((SvTYPE(arg) == SVt_RV) && (SvTYPE(SvRV(arg))==SVt_PVHV)) { \ HV * i = (HV*)SvRV(arg); \ SV ** s; \ var.userID = (s = hv_fetch(i, "userID", 6, 0)) ? SvIV(*s) : 0; \ var.viewerID = (s = hv_fetch(i, "viewerID", 8, 0)) ? SvIV(*s) : 0; \ var.lastSyncPC = (s = hv_fetch(i, "lastSyncPC", 10, 0)) ? SvIV(*s) : 0; \ var.lastSyncDate = (s = hv_fetch(i, "lastSyncDate", 12, 0)) ? SvIV(*s) : 0; \ var.successfulSyncDate = (s = hv_fetch(i, "successfulSyncDate", 18, 0)) ? SvIV(*s) : 0; \ if ((s = hv_fetch(i, "name", 4, 0)) ? SvPV(*s,na) : 0) \ strcpy(var.username, SvPV(*s, na)); \ } else {\ croak("argument is not a hash reference"); \ } #define PackAI \ { \ HV * h; \ if (SvRV(data) && \ (SvTYPE(h=(HV*)SvRV(data))==SVt_PVHV)) { \ int count; \ PUSHMARK(sp); \ XPUSHs(data); \ PUTBACK; \ count = perl_call_method("Pack", G_SCALAR); \ SPAGAIN; \ if (count != 1) \ croak("Unable to pack app block"); \ data = POPs; \ PUTBACK; \ } \ else { \ croak("Unable to pack app block"); \ } \ } #define ReturnReadAI(buf,size) \ if (result >=0) { \ if (self->Class) { \ int count; \ PUSHMARK(sp); \ XPUSHs(self->Class); \ XPUSHs(newSVpv(buf, size)); \ PUTBACK; \ count = perl_call_method("appblock", G_SCALAR); \ SPAGAIN; \ if (count != 1) \ croak("Unable to create appblock"); \ } \ else { \ croak("Class not defined"); \ } \ } else { \ self->errnop = result; \ PUSHs(&sv_undef); \ } #define PackSI \ { \ HV * h; \ if (SvRV(data) && \ (SvTYPE(h=(HV*)SvRV(data))==SVt_PVHV)) { \ int count; \ PUSHMARK(sp); \ XPUSHs(data); \ PUTBACK; \ count = perl_call_method("Pack", G_SCALAR); \ SPAGAIN; \ if (count != 1) \ croak("Unable to pack sort block"); \ data = POPs; \ PUTBACK; \ } \ else { \ croak("Unable to pack sort block"); \ } \ } #define ReturnReadSI(buf,size) \ if (result >=0) { \ if (self->Class) { \ int count; \ PUSHMARK(sp); \ XPUSHs(self->Class); \ XPUSHs(newSVpv(buf, size)); \ PUTBACK; \ count = perl_call_method("sortblock", G_SCALAR);\ SPAGAIN; \ if (count != 1) \ croak("Unable to create sortblock"); \ } \ else { \ croak("Class not defined"); \ } \ } else { \ self->errnop = result; \ PUSHs(&sv_undef); \ } #define PackRecord \ { \ HV * h; \ if (SvRV(data) && \ (SvTYPE(h=(HV*)SvRV(data))==SVt_PVHV)) { \ int count; \ SV ** s; \ if (!(s = hv_fetch(h, "id", 2, 0)) || !SvOK(*s)) \ croak("record must contain id"); \ id = SvIV(*s); \ attr = 0; \ if (!(s = hv_fetch(h, "secret", 6, 0)) || !SvOK(*s))\ croak("record must contain secret"); \ attr |= SvIV(*s) ? dlpRecAttrSecret : 0; \ if (!(s = hv_fetch(h, "deleted", 7, 0)) || !SvOK(*s)) \ croak("record must contain deleted"); \ attr |= SvIV(*s) ? dlpRecAttrDeleted : 0; \ if (!(s = hv_fetch(h, "modified", 8, 0)) || !SvOK(*s)) \ croak("record must contain deleted"); \ attr |= SvIV(*s) ? dlpRecAttrDirty : 0; \ if (!(s = hv_fetch(h, "busy", 4, 0)) || !SvOK(*s)) \ croak("record must contain deleted"); \ attr |= SvIV(*s) ? dlpRecAttrBusy : 0; \ if (!(s = hv_fetch(h, "archived", 8, 0)) || !SvOK(*s)) \ croak("record must contain deleted"); \ attr |= SvIV(*s) ? dlpRecAttrArchived : 0; \ if (!(s = hv_fetch(h, "category", 8, 0)) || !SvOK(*s)) \ croak("record must contain category"); \ category = SvIV(*s); \ PUSHMARK(sp); \ XPUSHs(data); \ PUTBACK; \ count = perl_call_method("Pack", G_SCALAR); \ SPAGAIN; \ if (count != 1) \ croak("Unable to pack record"); \ data = POPs; \ PUTBACK; \ } \ else { \ croak("Unable to pack record"); \ } \ } #define PackRaw \ { \ HV * h; \ if (SvRV(data) && \ (SvTYPE(h=(HV*)SvRV(data))==SVt_PVHV)) { \ int count; \ PUSHMARK(sp); \ XPUSHs(data); \ PUTBACK; \ count = perl_call_method("Raw", G_SCALAR); \ SPAGAIN; \ if (count != 1) { \ SV ** s = hv_fetch(h, "raw", 3, 0); \ if (s) \ data = *s; \ } else { \ data = POPs; \ PUTBACK; \ } \ } \ } #define ReturnReadRecord(buf,size) \ if (result >=0) { \ if (self->Class) { \ int count; \ SV * ret; \ PUSHMARK(sp); \ XPUSHs(self->Class); \ XPUSHs(newSVpv(buf, size)); \ XPUSHs(sv_2mortal(newSViv(id))); \ XPUSHs(sv_2mortal(newSViv(attr))); \ XPUSHs(sv_2mortal(newSViv(category))); \ XPUSHs(sv_2mortal(newSViv(index))); \ PUTBACK; \ count = perl_call_method("record", G_SCALAR); \ SPAGAIN; \ if (count != 1) \ croak("Unable to create record"); \ ret = POPs; \ PUTBACK; \ PUSHs(ret); \ } \ else { \ croak("Class not defined"); \ } \ } else { \ self->errnop = result; \ PUSHs(&sv_undef); \ } #define PackResource \ { \ HV * h; \ if (SvRV(data) && \ (SvTYPE(h=(HV*)SvRV(data))==SVt_PVHV)) { \ int count; \ SV ** s; \ if (!(s = hv_fetch(h, "id", 2, 0)) || !SvOK(*s))\ croak("record must contain id"); \ id = SvIV(*s); \ if (!(s = hv_fetch(h, "type", 4, 0)) || !SvOK(*s)) \ croak("record must contain type"); \ type = SvChar4(*s); \ PUSHMARK(sp); \ XPUSHs(data); \ PUTBACK; \ count = perl_call_method("Pack", G_SCALAR); \ SPAGAIN; \ if (count != 1) \ croak("Unable to pack resource"); \ data = POPs; \ PUTBACK; \ } \ else { \ croak("Unable to pack resource"); \ } \ } #define ReturnReadResource(buf,size) \ if (result >=0) { \ if (self->Class) { \ int count; \ PUSHMARK(sp); \ XPUSHs(self->Class); \ XPUSHs(newSVpv(buf, size)); \ XPUSHs(sv_2mortal(newSVChar4(type))); \ XPUSHs(sv_2mortal(newSViv(id))); \ XPUSHs(sv_2mortal(newSViv(index))); \ PUTBACK; \ count = perl_call_method("resource", G_SCALAR); \ SPAGAIN; \ if (count != 1) \ croak("Unable to create resource"); \ } \ else { \ croak("Class not defined"); \ } \ } else { \ self->errnop = result; \ PUSHs(&sv_undef); \ } #define PackPref \ { \ HV * h; \ if (SvRV(data) && \ (SvTYPE(h=(HV*)SvRV(data))==SVt_PVHV)) { \ int count; \ SV ** s; \ if (!(s = hv_fetch(h, "id", 2, 0)) || !SvOK(*s))\ croak("record must contain id"); \ id = SvIV(*s); \ if (!(s = hv_fetch(h, "creator", 7, 0)) || !SvOK(*s)) \ croak("record must contain type"); \ creator = SvChar4(*s); \ if (!(s = hv_fetch(h, "version", 7, 0)) || !SvOK(*s)) \ croak("record must contain type"); \ version = SvIV(*s); \ if (!(s = hv_fetch(h, "backup", 6, 0)) || !SvOK(*s)) \ croak("record must contain type"); \ backup = SvIV(*s); \ PUSHMARK(sp); \ XPUSHs(data); \ PUTBACK; \ count = perl_call_method("Pack", G_SCALAR); \ SPAGAIN; \ if (count != 1) \ croak("Unable to pack resource"); \ data = POPs; \ PUTBACK; \ } \ else { \ croak("Unable to pack resource"); \ } \ } #define ReturnReadPref(buf,size) \ if (result >=0) { \ HV * h = perl_get_hv("PDA::Pilot::PrefClasses", 0); \ SV ** s; \ int count; \ if (!h) \ croak("PrefClasses doesn't exist"); \ s = hv_fetch(h, printlong(creator), 4, 0); \ if (!s) \ s = hv_fetch(h, "", 0, 0); \ if (!s) \ croak("Default PrefClass not defined"); \ PUSHMARK(sp); \ XPUSHs(newSVsv(*s)); \ XPUSHs(newSVpv(buf, size)); \ XPUSHs(sv_2mortal(newSVChar4(creator))); \ XPUSHs(sv_2mortal(newSViv(id))); \ XPUSHs(sv_2mortal(newSViv(version))); \ XPUSHs(sv_2mortal(newSViv(backup))); \ PUTBACK; \ count = perl_call_method("pref", G_SCALAR); \ SPAGAIN; \ if (count != 1) \ croak("Unable to create resource"); \ } else { \ self->errnop = result; \ PUSHs(&sv_undef); \ } void doUnpackCategory(HV * self, struct CategoryAppInfo * c) { AV * e = newAV(); int i; hv_store(self, "categoryRenamed", 15, newRV_noinc((SV*)e), 0); for (i=0;i<16;i++) { av_push(e, newSViv(c->renamed[i])); } e = newAV(); hv_store(self, "categoryName", 12, newRV_noinc((SV*)e), 0); for (i=0;i<16;i++) { av_push(e, newSVpv(c->name[i], 0)); } e = newAV(); hv_store(self, "categoryID", 10, newRV_noinc((SV*)e), 0); for (i=0;i<16;i++) { av_push(e, newSViv(c->ID[i])); } hv_store(self, "categoryLastUniqueID", 20, newSViv(c->lastUniqueID), 0); } void doPackCategory(HV * self, struct CategoryAppInfo * c) { SV ** s; AV * av; int i; if ((s = hv_fetch(self, "categoryName", 12, 0)) && SvOK(*s) && SvRV(*s) && (SvTYPE(av=(AV*)SvRV(*s))==SVt_PVAV)) for (i=0;i<16;i++) strncpy(c->name[i], (s=av_fetch(av, i, 0)) ? SvPV(*s,na) : "", 16); else for (i=0;i<16;i++) strcpy(c->name[i], ""); for (i=0;i<16;i++) c->name[i][15] = '\0'; if ((s = hv_fetch(self, "categoryID", 10, 0)) && SvOK(*s) && SvRV(*s) && (SvTYPE(av=(AV*)SvRV(*s))==SVt_PVAV)) for (i=0;i<16;i++) c->ID[i] = (s=av_fetch(av, i, 0)) ? SvIV(*s) : 0; else for (i=0;i<16;i++) c->ID[i] = 0; if ((s = hv_fetch(self, "categoryRenamed", 10, 0)) && SvOK(*s) && SvRV(*s) && (SvTYPE(av=(AV*)SvRV(*s))==SVt_PVAV)) for (i=0;i<16;i++) c->renamed[i] = (s=av_fetch(av, i, 0)) ? SvIV(*s) : 0; else for (i=0;i<16;i++) c->renamed[i] = 0; } int SvList(SV * arg, char **list) { int i; char * str = SvPV(arg, na); for (i=0;list[i];i++) if (strcasecmp(list[i], str)==0) return i; if (SvPOKp(arg)) { croak("Invalid value"); } return SvIV(arg); } SV * newSVlist(int value, char **list) { int i; for (i=0;list[i];i++) ; if (value < i) return newSVpv(list[value], 0); else return newSViv(value); } MODULE = PDA::Pilot PACKAGE = PDA::Pilot double constant(name,arg) char * name int arg MODULE = PDA::Pilot PACKAGE = PDA::Pilot::Appointment SV * Unpack(record) SV * record CODE: { STRLEN len; int i; AV * e; HV * ret, *h; struct Appointment a; if (SvOK(record) && SvRV(record) && (SvTYPE(SvRV(record)) == SVt_PVHV)) { SV ** raw; ret = (HV*)SvRV(record); raw = hv_fetch(ret, "raw", 3, 0); if (!raw || !SvOK(*raw)) croak("Unable to unpack"); RETVAL = newSVsv(record); record = *raw; } else { ret = newHV(); hv_store(ret, "raw", 3, newSVsv(record),0); RETVAL = newRV_noinc((SV*)ret); } SvPV(record,len); if (unpack_Appointment(&a, (CPTR)SvPV(record, na), len)>0) { hv_store(ret, "event", 5, newSViv(a.event), 0); hv_store(ret, "begin", 5, newRV_noinc((SV*)tmtoav(&a.begin)), 0); if (!a.event) { hv_store(ret, "end", 3, newRV_noinc((SV*)tmtoav(&a.end)), 0); } if (a.alarm) { HV * alarm = newHV(); hv_store(ret, "alarm", 5, newRV_noinc((SV*)alarm), 0); hv_store(alarm, "advance", 7, newSViv(a.advance), 0); hv_store(alarm, "units", 5, newSVpv(( (a.advanceUnits == 0) ? "minutes" : /* Minutes */ (a.advanceUnits == 1) ? "hours" : /* Hours */ (a.advanceUnits == 2) ? "days" : /* Days */ 0), 0), 0); if (a.advanceUnits > 2) { warn("Invalid advance unit %d encountered", a.advanceUnits); } } if (a.repeatType) { HV * repeat = newHV(); hv_store(ret, "repeat", 6, newRV_noinc((SV*)repeat), 0); hv_store(repeat, "type", 4, newSVpv(DatebookRepeatTypeNames[a.repeatType],0), 0); hv_store(repeat, "frequency", 9, newSViv(a.repeatFrequency), 0); if (a.repeatType == repeatMonthlyByDay) hv_store(repeat, "day", 3, newSViv(a.repeatDay), 0); else if (a.repeatType == repeatWeekly) { e = newAV(); hv_store(repeat, "days", 4, newRV_noinc((SV*)e), 0); for (i=0;i<7;i++) av_push(e,newSViv(a.repeatDays[i])); } hv_store(repeat, "weekstart", 9, newSViv(a.repeatWeekstart), 0); if (!a.repeatForever) hv_store(repeat, "end", 3, newRV_noinc((SV*)tmtoav(&a.repeatEnd)),0); } if (a.exceptions) { e = newAV(); hv_store(ret, "exceptions", 10, newRV_noinc((SV*)e), 0); for (i=0;i 254) warn("Alarm advance value %d out of range", a.advance); a.alarm = 1; } else { a.alarm = 0; a.advance = 0; a.advanceUnits = 0; } if ((s = hv_fetch(h, "repeat", 6, 0)) && SvOK(*s) && SvRV(*s) && (SvTYPE(SvRV(*s))==SVt_PVHV)) { HV * h2 = (HV*)SvRV(*s); int i; a.repeatType = (s = hv_fetch(h2, "type", 4, 0)) ? SvList(*s, DatebookRepeatTypeNames) : 0; a.repeatFrequency = (s = hv_fetch(h2, "frequency", 9, 0)) ? SvIV(*s) : 0; a.repeatDay = 0; for(i=0;i<7;i++) a.repeatDays[i] = 0; if (a.repeatType == repeatMonthlyByDay ) { a.repeatDay = (s = hv_fetch(h2, "day", 3, 0)) ? SvIV(*s) : 0; } else if (a.repeatType == repeatWeekly) { if ((s = hv_fetch(h2, "days", 4, 0)) && SvOK(*s) && SvRV(*s) && (SvTYPE(SvRV(*s))==SVt_PVAV)) { int i; AV * a2 = (AV*)SvRV(*s); for (i=0;i<7;i++) if ((s = av_fetch(a2, i, 0))) a.repeatDays[i] = SvIV(*s); } } a.repeatWeekstart = (s = hv_fetch(h2, "weekstart", 9, 0)) ? SvIV(*s) : 0; if ((s = hv_fetch(h2, "end", 3, 0)) && SvOK(*s) && SvRV(*s) && (SvTYPE(SvRV(*s))==SVt_PVAV)) { avtotm((AV*)SvRV(*s), &a.repeatEnd); a.repeatForever = 0; } else { a.repeatForever = 1; } } else { a.repeatType = 0; a.repeatForever = 0; a.repeatFrequency = 0; a.repeatDay = 0; a.repeatWeekstart = 0; memset(&a.repeatEnd,'\0', sizeof(struct tm)); } a.exceptions = 0; a.exception = 0; if ((s = hv_fetch(h, "exceptions", 10, 0)) && SvOK(*s) && SvRV(*s) && (SvTYPE(SvRV(*s))==SVt_PVAV)) { int i; AV * a2 = (AV*)SvRV(*s); if (av_len(a2)>-1) { a.exceptions = av_len(a2)+1; a.exception = malloc(sizeof(struct tm)*a.exceptions); for (i=0;i0) { doUnpackCategory(ret, &a.category); hv_store(ret, "startOfWeek", 11, newSViv(a.startOfWeek), 0); } } OUTPUT: RETVAL SV * PackAppBlock(record) SV * record CODE: { int i; int len; SV ** s; HV * h; AV * av; struct AppointmentAppInfo a; if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV)) RETVAL = record; else { doPackCategory(h, &a.category); if ((s = hv_fetch(h, "startOfWeek", 11, 0))) a.startOfWeek = SvIV(*s); else a.startOfWeek = 0; len = pack_AppointmentAppInfo(&a, (CPTR)mybuf, 0xffff); RETVAL = newSVpv(mybuf, len); hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0); } } OUTPUT: RETVAL MODULE = PDA::Pilot PACKAGE = PDA::Pilot::ToDo SV * Unpack(record) SV * record CODE: { STRLEN len; int i; AV * e; HV * ret; struct ToDo a; if (SvOK(record) && SvRV(record) && (SvTYPE(SvRV(record)) == SVt_PVHV)) { SV ** raw; ret = (HV*)SvRV(record); raw = hv_fetch(ret, "raw", 3, 0); if (!raw || !SvOK(*raw)) croak("Unable to unpack"); RETVAL = newSVsv(record); record = *raw; } else { ret = newHV(); hv_store(ret, "raw", 3, newSVsv(record),0); RETVAL = newRV_noinc((SV*)ret); } SvPV(record,len); if (unpack_ToDo(&a, (CPTR)SvPV(record, na), len)>0) { if (!a.indefinite) hv_store(ret, "due", 3, newRV_noinc((SV*)tmtoav(&a.due)), 0); hv_store(ret, "priority", 8, newSViv(a.priority), 0); hv_store(ret, "complete", 8, newSViv(a.complete), 0); if (a.description) hv_store(ret, "description", 11, newSVpv((char*)a.description,0), 0); if (a.note) hv_store(ret, "note", 4, newSVpv((char*)a.note,0), 0); free_ToDo(&a); } } OUTPUT: RETVAL SV * Pack(record) SV * record CODE: { int len; SV ** s; HV * h; struct ToDo a; if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV)) RETVAL = record; else if ((s=hv_fetch(h, "deleted", 7, 0)) && SvOK(*s) && SvTRUE(*s) && (s=hv_fetch(h, "archived", 8, 0)) && SvOK(*s) && !SvTRUE(*s)) { RETVAL = newSVpv("",0); hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0); } else { a.priority = (s = hv_fetch(h, "priority", 8, 0)) ? SvIV(*s) : 0; a.complete = (s = hv_fetch(h, "complete", 8, 0)) ? SvIV(*s) : 0; if ((s = hv_fetch(h, "due", 3, 0)) && SvOK(*s) && SvRV(*s) && (SvTYPE(SvRV(*s))==SVt_PVAV)) { avtotm((AV*)SvRV(*s), &a.due); a.indefinite = 0; } else { memset(&a.due,'\0', sizeof(struct tm)); a.indefinite = 1; } a.description = (s = hv_fetch(h, "description", 11, 0)) ? SvPV(*s,na) : 0; a.note = (s = hv_fetch(h, "note", 4, 0)) ? SvPV(*s,na) : 0; len = pack_ToDo(&a, (CPTR)mybuf, 0xffff); RETVAL = newSVpv(mybuf, len); hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0); } } OUTPUT: RETVAL SV * UnpackAppBlock(record) SV * record CODE: { STRLEN len; AV * e; HV * ret; int i; struct ToDoAppInfo a; if (SvOK(record) && SvRV(record) && (SvTYPE(SvRV(record)) == SVt_PVHV)) { SV ** raw; ret = (HV*)SvRV(record); raw = hv_fetch(ret, "raw", 3, 0); if (!raw || !SvOK(*raw)) croak("Unable to unpack"); RETVAL = newSVsv(record); record = *raw; } else { ret = newHV(); hv_store(ret, "raw", 3, newSVsv(record),0); RETVAL = newRV_noinc((SV*)ret); } SvPV(record,len); if (unpack_ToDoAppInfo(&a, (CPTR)SvPV(record, na), len)>0) { doUnpackCategory(ret, &a.category); hv_store(ret, "dirty", 5, newSViv(a.dirty), 0); hv_store(ret, "sortByPriority", 14, newSViv(a.sortByPriority), 0); } } OUTPUT: RETVAL SV * PackAppBlock(record) SV * record CODE: { int i; int len; SV ** s; HV * h; AV * av; struct ToDoAppInfo a; if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV)) RETVAL = record; else { doUnpackCategory(h, &a.category); doPackCategory(h, &a.category); a.dirty = (s = hv_fetch(h, "dirty", 5, 0)) ? SvIV(*s) : 0; a.sortByPriority = (s = hv_fetch(h, "sortByPriority", 14, 0)) ? SvIV(*s) : 0; len = pack_ToDoAppInfo(&a, (CPTR)mybuf, 0xffff); RETVAL = newSVpv(mybuf, len); hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0); } } OUTPUT: RETVAL MODULE = PDA::Pilot PACKAGE = PDA::Pilot::Address SV * Unpack(record) SV * record CODE: { STRLEN len; int i; AV * e; HV * ret; struct Address a; if (SvOK(record) && SvRV(record) && (SvTYPE(SvRV(record)) == SVt_PVHV)) { SV ** raw; ret = (HV*)SvRV(record); raw = hv_fetch(ret, "raw", 3, 0); if (!raw || !SvOK(*raw)) croak("Unable to unpack"); RETVAL = newSVsv(record); record = *raw; } else { ret = newHV(); hv_store(ret, "raw", 3, newSVsv(record),0); RETVAL = newRV_noinc((SV*)ret); } SvPV(record,len); if (unpack_Address(&a, (CPTR)SvPV(record, na), len)>0) { e = newAV(); hv_store(ret, "phoneLabel", 10, newRV_noinc((SV*)e), 0); for (i=0;i<5;i++) { av_push(e, newSViv(a.phoneLabel[i])); } e = newAV(); hv_store(ret, "entry", 5, newRV_noinc((SV*)e), 0); for (i=0;i<19;i++) { av_push(e, a.entry[i] ? newSVpv(a.entry[i],0) : &sv_undef); } hv_store(ret, "showPhone", 9, newSViv(a.showPhone), 0); free_Address(&a); } } OUTPUT: RETVAL SV * Pack(record) SV * record CODE: { int len; SV ** s; HV * h; AV * av; int i; struct Address a; if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV)) RETVAL = record; else if ((s=hv_fetch(h, "deleted", 7, 0)) && SvOK(*s) && SvTRUE(*s) && (s=hv_fetch(h, "archived", 8, 0)) && SvOK(*s) && !SvTRUE(*s)) { RETVAL = newSVpv("",0); hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0); } else { if ((s = hv_fetch(h, "phoneLabel", 10, 0)) && SvOK(*s) && SvRV(*s) && (SvTYPE(av=(AV*)SvRV(*s))==SVt_PVAV)) for (i=0;i<5;i++) a.phoneLabel[i] = ((s=av_fetch(av, i, 0)) && SvOK(*s)) ? SvIV(*s) : 0; else for (i=0;i<5;i++) a.phoneLabel[i] = 0; if ((s = hv_fetch(h, "entry", 5, 0)) && SvOK(*s) && SvRV(*s) && (SvTYPE(av=(AV*)SvRV(*s))==SVt_PVAV)) for (i=0;i<19;i++) a.entry[i] = ((s=av_fetch(av, i, 0)) && SvOK(*s)) ? SvPV(*s,na) : 0; else for (i=0;i<19;i++) a.entry[i] = 0; if ((s = hv_fetch(h, "showPhone", 9, 0))) a.showPhone = SvIV(*s); else a.showPhone = 0; len = pack_Address(&a, (CPTR)mybuf, 0xffff); RETVAL = newSVpv(mybuf, len); hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0); } } OUTPUT: RETVAL SV * UnpackAppBlock(record) SV * record CODE: { STRLEN len; AV * e; HV * ret; int i; struct AddressAppInfo a; if (SvOK(record) && SvRV(record) && (SvTYPE(SvRV(record)) == SVt_PVHV)) { SV ** raw; ret = (HV*)SvRV(record); raw = hv_fetch(ret, "raw", 3, 0); if (!raw || !SvOK(*raw)) croak("Unable to unpack"); RETVAL = newSVsv(record); record = *raw; } else { ret = newHV(); hv_store(ret, "raw", 3, newSVsv(record),0); RETVAL = newRV_noinc((SV*)ret); } SvPV(record,len); if (unpack_AddressAppInfo(&a, (CPTR)SvPV(record, na), len)>0) { doUnpackCategory(ret, &a.category); e = newAV(); hv_store(ret, "labelRenamed", 12, newRV_noinc((SV*)e), 0); for (i=0;i<22;i++) { av_push(e, newSViv(a.labelRenamed[i])); } hv_store(ret, "country", 7, newSViv(a.country), 0); hv_store(ret, "sortByCompany", 13, newSViv(a.sortByCompany), 0); e = newAV(); hv_store(ret, "label", 5, newRV_noinc((SV*)e), 0); for (i=0;i<22;i++) { av_push(e, newSVpv(a.labels[i],0)); } e = newAV(); hv_store(ret, "phoneLabel", 10, newRV_noinc((SV*)e), 0); for (i=0;i<8;i++) { av_push(e, newSVpv(a.phoneLabels[i],0)); } } } OUTPUT: RETVAL SV * PackAppBlock(record) SV * record CODE: { int i; int len; SV ** s; HV * h; AV * av; struct AddressAppInfo a; if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV)) RETVAL = record; else { doPackCategory(h, &a.category); if ((s = hv_fetch(h, "labelRenamed", 12, 0)) && SvOK(*s) && SvRV(*s) && (SvTYPE(av=(AV*)SvRV(*s))==SVt_PVAV)) for (i=0;i<22;i++) a.labelRenamed[i] = (s=av_fetch(av, i, 0)) ? SvIV(*s) : 0; else for (i=0;i<22;i++) a.labelRenamed[i] = 0; a.country = (s = hv_fetch(h, "country", 7, 0)) ? SvIV(*s) : 0; a.sortByCompany = (s = hv_fetch(h, "sortByCompany", 13, 0)) ? SvIV(*s) : 0; if ((s = hv_fetch(h, "label", 5, 0)) && SvOK(*s) && SvRV(*s) && (SvTYPE(av=(AV*)SvRV(*s))==SVt_PVAV)) for (i=0;i<22;i++) strncpy(a.labels[i], (s=av_fetch(av, i, 0)) ? SvPV(*s,na) : "", 16); else for (i=0;i<22;i++) a.labels[i][0] = 0; for (i=0;i<22;i++) a.labels[i][15] = 0; if ((s = hv_fetch(h, "phoneLabel", 10, 0)) && SvOK(*s) && SvRV(*s) && (SvTYPE(av=(AV*)SvRV(*s))==SVt_PVAV)) for (i=0;i<8;i++) strncpy(a.phoneLabels[i], (s=av_fetch(av, i, 0)) ? SvPV(*s,na) : "", 16); else for (i=0;i<8;i++) a.phoneLabels[i][0] = 0; for (i=0;i<8;i++) a.phoneLabels[i][15] = 0; len = pack_AddressAppInfo(&a, (CPTR)mybuf, 0xffff); RETVAL = newSVpv(mybuf, len); hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0); } } OUTPUT: RETVAL MODULE = PDA::Pilot PACKAGE = PDA::Pilot::Memo SV * Unpack(record) SV * record CODE: { STRLEN len; int i; AV * e; HV * ret; struct Memo a; if (SvOK(record) && SvRV(record) && (SvTYPE(SvRV(record)) == SVt_PVHV)) { SV ** raw; ret = (HV*)SvRV(record); raw = hv_fetch(ret, "raw", 3, 0); if (!raw || !SvOK(*raw)) croak("Unable to unpack"); RETVAL = newSVsv(record); record = *raw; } else { ret = newHV(); hv_store(ret, "raw", 3, newSVsv(record),0); RETVAL = newRV_noinc((SV*)ret); } SvPV(record,len); if (unpack_Memo(&a, (CPTR)SvPV(record, na), len)>0) { hv_store(ret, "text", 4, newSVpv(a.text,0), 0); free_Memo(&a); } } OUTPUT: RETVAL SV * Pack(record) SV * record CODE: { STRLEN len; SV ** s; HV * h; struct Memo a; if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV)) RETVAL = record; else if ((s=hv_fetch(h, "deleted", 7, 0)) && SvOK(*s) && SvTRUE(*s) && (s=hv_fetch(h, "archived", 8, 0)) && SvOK(*s) && !SvTRUE(*s)) { RETVAL = newSVpv("",0); hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0); } else { if ((s = hv_fetch(h, "text", 4, 0))) a.text = SvPV(*s,na); else a.text = 0; len = pack_Memo(&a, (CPTR)mybuf, 0xffff); RETVAL = newSVpv(mybuf, len); hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0); } } OUTPUT: RETVAL SV * UnpackAppBlock(record) SV * record CODE: { STRLEN len; AV * e; HV * ret; int i; struct MemoAppInfo a; if (SvOK(record) && SvRV(record) && (SvTYPE(SvRV(record)) == SVt_PVHV)) { SV ** raw; ret = (HV*)SvRV(record); raw = hv_fetch(ret, "raw", 3, 0); if (!raw || !SvOK(*raw)) croak("Unable to unpack"); RETVAL = newSVsv(record); record = *raw; } else { ret = newHV(); hv_store(ret, "raw", 3, newSVsv(record),0); RETVAL = newRV_noinc((SV*)ret); } SvPV(record,len); if (unpack_MemoAppInfo(&a, (CPTR)SvPV(record, na), len)>0) { doUnpackCategory(ret, &a.category); hv_store(ret, "sortByAlpha", 11, newSViv(a.sortByAlpha), 0); } } OUTPUT: RETVAL SV * PackAppBlock(record) SV * record CODE: { int i; int len; SV ** s; HV * h; AV * av; struct MemoAppInfo a; if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV)) RETVAL = record; else { doPackCategory(h, &a.category); if ((s = hv_fetch(h, "sortByAlpha", 11, 0))) a.sortByAlpha = SvIV(*s); else a.sortByAlpha = 0; len = pack_MemoAppInfo(&a, (CPTR)mybuf, 0xffff); RETVAL = newSVpv(mybuf, len); hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0); } } OUTPUT: RETVAL MODULE = PDA::Pilot PACKAGE = PDA::Pilot::Expense SV * Unpack(record) SV * record CODE: { STRLEN len; int i; HV * ret; struct Expense e; if (SvOK(record) && SvRV(record) && (SvTYPE(SvRV(record)) == SVt_PVHV)) { SV ** raw; ret = (HV*)SvRV(record); raw = hv_fetch(ret, "raw", 3, 0); if (!raw || !SvOK(*raw)) croak("Unable to unpack"); RETVAL = newSVsv(record); record = *raw; } else { ret = newHV(); hv_store(ret, "raw", 3, newSVsv(record),0); RETVAL = newRV_noinc((SV*)ret); } SvPV(record,len); if (unpack_Expense(&e, (CPTR)SvPV(record, na), len)>0) { hv_store(ret, "date", 4, newRV_noinc((SV*)tmtoav(&e.date)), 0); hv_store(ret, "type", 4, newSVlist(e.type,ExpenseTypeNames),0); hv_store(ret, "payment", 7, newSVlist(e.payment,ExpensePaymentNames),0); hv_store(ret, "currency", 8, newSViv(e.currency),0); if (e.amount) hv_store(ret, "amount", 6, newSVpv(e.amount,0), 0); if (e.vendor) hv_store(ret, "vendor", 6, newSVpv(e.vendor,0), 0); if (e.city) hv_store(ret, "city", 4, newSVpv(e.city,0), 0); if (e.note) hv_store(ret, "note", 4, newSVpv(e.note,0), 0); if (e.attendees) hv_store(ret, "attendees", 9, newSVpv(e.attendees,0), 0); free_Expense(&e); } } OUTPUT: RETVAL SV * Pack(record) SV * record CODE: { STRLEN len; SV ** s; HV * h; struct Expense e; if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV)) RETVAL = record; else if ((s=hv_fetch(h, "deleted", 7, 0)) && SvOK(*s) && SvTRUE(*s) && (s=hv_fetch(h, "archived", 8, 0)) && SvOK(*s) && !SvTRUE(*s)) { RETVAL = newSVpv("",0); hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0); } else { if ((s = hv_fetch(h, "type", 4, 0))) e.type = SvList(*s,ExpenseTypeNames); else croak("must have type"); if ((s = hv_fetch(h, "payment", 7, 0))) e.payment = SvList(*s,ExpensePaymentNames); else croak("must have payment"); if ((s = hv_fetch(h, "currency", 8, 0))) e.currency = SvIV(*s); else croak("must have currency"); if ((s = hv_fetch(h, "date", 4, 0)) && SvOK(*s) && SvRV(*s) && (SvTYPE(SvRV(*s))==SVt_PVAV)) avtotm((AV*)SvRV(*s), &e.date); else croak("expense record must contain date"); if ((s = hv_fetch(h, "amount", 6, 0))) e.amount = SvPV(*s,na); else e.amount = 0; if ((s = hv_fetch(h, "vendor", 6, 0))) e.vendor = SvPV(*s,na); else e.vendor = 0; if ((s = hv_fetch(h, "city", 4, 0))) e.city = SvPV(*s,na); else e.city = 0; if ((s = hv_fetch(h, "attendess", 9, 0))) e.attendees = SvPV(*s,na); else e.attendees = 0; if ((s = hv_fetch(h, "note", 4, 0))) e.note = SvPV(*s,na); else e.note = 0; len = pack_Expense(&e, (CPTR)mybuf, 0xffff); RETVAL = newSVpv(mybuf, len); hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0); } } OUTPUT: RETVAL SV * UnpackAppBlock(record) SV * record CODE: { STRLEN len; HV * ret; AV * a; int i; struct ExpenseAppInfo e; if (SvOK(record) && SvRV(record) && (SvTYPE(SvRV(record)) == SVt_PVHV)) { SV ** raw; ret = (HV*)SvRV(record); raw = hv_fetch(ret, "raw", 3, 0); if (!raw || !SvOK(*raw)) croak("Unable to unpack"); RETVAL = newSVsv(record); record = *raw; } else { ret = newHV(); hv_store(ret, "raw", 3, newSVsv(record),0); RETVAL = newRV_noinc((SV*)ret); } SvPV(record,len); if (unpack_ExpenseAppInfo(&e, (CPTR)SvPV(record, na), len)>0) { hv_store(ret, "sortOrder", 9, newSVlist(e.sortOrder,ExpenseSortNames),0); a = newAV(); hv_store(ret, "currencies", 10, newRV_noinc((SV*)a), 0); for (i=0;i<4;i++) { HV * h = newHV(); hv_store(h, "name", 4, newSVpv(e.currencies[i].name, 0), 0); hv_store(h, "symbol", 6, newSVpv(e.currencies[i].symbol, 0), 0); hv_store(h, "rate", 4, newSVpv(e.currencies[i].rate, 0), 0); av_store(a, i, (SV*)newRV_noinc((SV*)h)); } doUnpackCategory(ret, &e.category); } } OUTPUT: RETVAL SV * PackAppBlock(record) SV * record CODE: { int i; int len; SV ** s; HV * h; AV * av; struct ExpenseAppInfo e; if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV)) RETVAL = record; else { doPackCategory(h, &e.category); e.sortOrder = (s = hv_fetch(h, "sortOrder", 9, 0)) ? SvList(*s, ExpenseSortNames) : 0; if ((s=hv_fetch(h, "currencies", 10, 0)) && SvOK(*s) && SvRV(*s) && (SvTYPE(av=(AV*)SvRV(*s))==SVt_PVAV)) { for(i=0;i<4;i++) { HV * hv; if ((s=av_fetch(av, i, 0)) && SvOK(*s) && SvRV(*s) && (SvTYPE(hv=(HV*)SvRV(*s))==SVt_PVHV)) { if (s = hv_fetch(hv, "name", 4, 0)) { strncpy(e.currencies[i].name, SvPV(*s, na), 16); e.currencies[i].name[15] = 0; } if (s = hv_fetch(hv, "symbol", 6, 0)) { strncpy(e.currencies[i].symbol, SvPV(*s, na), 4); e.currencies[i].symbol[3] = 0; } if (s = hv_fetch(hv, "rate", 4, 0)) { strncpy(e.currencies[i].rate, SvPV(*s, na), 8); e.currencies[i].rate[7] = 0; } } } } else for(i=0;i<4;i++) { e.currencies[i].symbol[0] = 0; e.currencies[i].name[0] = 0; e.currencies[i].rate[0] = 0; } len = pack_ExpenseAppInfo(&e, (CPTR)mybuf, 0xffff); RETVAL = newSVpv(mybuf, len); hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0); } } OUTPUT: RETVAL SV * UnpackPref(record) SV * record CODE: { STRLEN len; AV * e; HV * ret; int i; struct ExpensePref a; if (SvOK(record) && SvRV(record) && (SvTYPE(SvRV(record)) == SVt_PVHV)) { SV ** raw; ret = (HV*)SvRV(record); raw = hv_fetch(ret, "raw", 3, 0); if (!raw || !SvOK(*raw)) croak("Unable to unpack"); RETVAL = newSVsv(record); record = *raw; } else { ret = newHV(); hv_store(ret, "raw", 3, newSVsv(record),0); RETVAL = newRV_noinc((SV*)ret); } SvPV(record,len); if (unpack_ExpensePref(&a, (CPTR)SvPV(record, na), len)>0) { hv_store(ret, "unitOfDistance", 14, newSVlist(a.unitOfDistance, ExpenseDistanceNames), 0); hv_store(ret, "currentCategory", 15, newSViv(a.currentCategory), 0); hv_store(ret, "defaultCategory", 15, newSViv(a.defaultCategory), 0); hv_store(ret, "noteFont", 8, newSViv(a.noteFont), 0); hv_store(ret, "showAllCategories", 17, newSViv(a.showAllCategories), 0); hv_store(ret, "showCurrency", 12, newSViv(a.showCurrency), 0); hv_store(ret, "saveBackup", 10, newSViv(a.saveBackup), 0); hv_store(ret, "allowQuickFill", 14, newSViv(a.allowQuickFill), 0); e = newAV(); for (i=0;i<7;i++) av_store(e, i, newSViv(a.currencies[i])); hv_store(ret, "currencies", 10, (SV*)newRV_noinc((SV*)e), 0); } } OUTPUT: RETVAL SV * PackPref(record, id) SV * record int id CODE: { int i; int len; SV ** s; HV * h; AV * av; struct ExpensePref a; if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV)) RETVAL = record; else { a.unitOfDistance = (s = hv_fetch(h, "unitOfDistance", 14, 0)) ? SvList(*s, ExpenseDistanceNames) : 0; a.currentCategory = (s=hv_fetch(h,"currentCategory",15,0)) ? SvIV(*s) : 0; a.defaultCategory = (s=hv_fetch(h,"defaultCategory",15,0)) ? SvIV(*s) : 0; a.noteFont = (s=hv_fetch(h,"noteFont",8,0)) ? SvIV(*s) : 0; a.showAllCategories = (s=hv_fetch(h,"showAllCategories",17,0)) ? SvIV(*s) : 0; a.showCurrency = (s=hv_fetch(h,"showCurrency",12,0)) ? SvIV(*s) : 0; a.saveBackup = (s=hv_fetch(h,"saveBackup",10,0)) ? SvIV(*s) : 0; a.allowQuickFill = (s=hv_fetch(h,"allowQuickFill",14,0)) ? SvIV(*s) : 0; if ((s=hv_fetch(h, "currencies", 10, 0)) && SvOK(*s) && SvRV(*s) && (SvTYPE(av=(AV*)SvRV(*s))==SVt_PVAV)) { for(i=0;i<7;i++) a.currencies[i] = (s=av_fetch(av, i, 0)) ? SvIV(*s) : 0; } else for(i=0;i<7;i++) a.currencies[i] = 0; len = pack_ExpensePref(&a, (CPTR)mybuf, 0xffff); RETVAL = newSVpv(mybuf, len); hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0); } } OUTPUT: RETVAL MODULE = PDA::Pilot PACKAGE = PDA::Pilot::Mail SV * Unpack(record) SV * record CODE: { STRLEN len; int i; AV * e; HV * ret; struct Mail a; if (SvOK(record) && SvRV(record) && (SvTYPE(SvRV(record)) == SVt_PVHV)) { SV ** raw; ret = (HV*)SvRV(record); raw = hv_fetch(ret, "raw", 3, 0); if (!raw || !SvOK(*raw)) croak("Unable to unpack"); RETVAL = newSVsv(record); record = *raw; } else { ret = newHV(); hv_store(ret, "raw", 3, newSVsv(record),0); RETVAL = newRV_noinc((SV*)ret); } SvPV(record,len); if (unpack_Mail(&a, (CPTR)SvPV(record, na), len)>0) { if (a.subject) hv_store(ret, "subject", 7, newSVpv(a.subject,0), 0); if (a.from) hv_store(ret, "from", 4, newSVpv(a.from,0), 0); if (a.to) hv_store(ret, "to", 2, newSVpv(a.to,0), 0); if (a.cc) hv_store(ret, "cc", 2, newSVpv(a.cc,0), 0); if (a.bcc) hv_store(ret, "bcc", 3, newSVpv(a.bcc,0), 0); if (a.replyTo) hv_store(ret, "replyTo", 7, newSVpv(a.replyTo,0), 0); if (a.sentTo) hv_store(ret, "sentTo", 6, newSVpv(a.sentTo,0), 0); if (a.body) hv_store(ret, "body", 4, newSVpv(a.body,0), 0); hv_store(ret, "read", 4, newSViv(a.read), 0); hv_store(ret, "signature", 9, newSViv(a.signature), 0); hv_store(ret, "confirmRead", 11, newSViv(a.confirmRead), 0); hv_store(ret, "confirmDelivery", 15, newSViv(a.confirmDelivery), 0); hv_store(ret, "priority", 8, newSViv(a.priority), 0); hv_store(ret, "addressing", 10, newSViv(a.addressing), 0); if (a.dated) hv_store(ret, "date", 4, newRV_noinc((SV*)tmtoav(&a.date)), 0); free_Mail(&a); } } OUTPUT: RETVAL SV * Pack(record) SV * record CODE: { STRLEN len; SV ** s; HV * h; struct Mail a; if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV)) RETVAL = record; else if ((s=hv_fetch(h, "deleted", 7, 0)) && SvOK(*s) && SvTRUE(*s) && (s=hv_fetch(h, "archived", 8, 0)) && SvOK(*s) && !SvTRUE(*s)) { RETVAL = newSVpv("",0); hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0); } else { a.subject = (s = hv_fetch(h, "subject", 7, 0)) ? SvPV(*s,na) : 0; a.from = (s = hv_fetch(h, "from", 4, 0)) ? SvPV(*s,na) : 0; a.to = (s = hv_fetch(h, "to", 2, 0)) ? SvPV(*s,na) : 0; a.cc = (s = hv_fetch(h, "cc", 2, 0)) ? SvPV(*s,na) : 0; a.bcc = (s = hv_fetch(h, "bcc", 3, 0)) ? SvPV(*s,na) : 0; a.replyTo = (s = hv_fetch(h, "replyTo", 7, 0)) ? SvPV(*s,na) : 0; a.sentTo = (s = hv_fetch(h, "sentTo", 6, 0)) ? SvPV(*s,na) : 0; a.body = (s = hv_fetch(h, "body", 4, 0)) ? SvPV(*s,na) : 0; a.read = (s = hv_fetch(h, "read", 4, 0)) ? SvIV(*s) : 0; a.signature = (s = hv_fetch(h, "signature", 9, 0)) ? SvIV(*s) : 0; a.confirmRead = (s = hv_fetch(h, "confirmRead", 11, 0)) ? SvIV(*s) : 0; a.confirmDelivery = (s = hv_fetch(h, "confirmDelivery", 15, 0)) ? SvIV(*s) : 0; a.priority = (s = hv_fetch(h, "priority", 8, 0)) ? SvIV(*s) : 0; a.addressing = (s = hv_fetch(h, "addressing", 10, 0)) ? SvIV(*s) : 0; a.dated = (s = hv_fetch(h, "date", 4, 0)) ? 1 : 0; if (s && SvOK(*s) && SvRV(*s) && (SvTYPE(SvRV(*s))==SVt_PVAV)) avtotm((AV*)SvRV(*s), &a.date); len = pack_Mail(&a, (CPTR)mybuf, 0xffff); RETVAL = newSVpv(mybuf, len); hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0); } } OUTPUT: RETVAL SV * UnpackAppBlock(record) SV * record CODE: { STRLEN len; AV * e; HV * ret; int i; struct MailAppInfo a; if (SvOK(record) && SvRV(record) && (SvTYPE(SvRV(record)) == SVt_PVHV)) { SV ** raw; ret = (HV*)SvRV(record); raw = hv_fetch(ret, "raw", 3, 0); if (!raw || !SvOK(*raw)) croak("Unable to unpack"); RETVAL = newSVsv(record); record = *raw; } else { ret = newHV(); hv_store(ret, "raw", 3, newSVsv(record),0); RETVAL = newRV_noinc((SV*)ret); } SvPV(record,len); if (unpack_MailAppInfo(&a, (CPTR)SvPV(record, na), len)>0) { doUnpackCategory(ret, &a.category); hv_store(ret, "sortOrder", 9, newSVlist(a.sortOrder, MailSortTypeNames), 0); hv_store(ret, "dirty", 5, newSViv(a.dirty), 0); hv_store(ret, "unsentMessage", 13, newSViv(a.unsentMessage), 0); } } OUTPUT: RETVAL SV * PackAppBlock(record) SV * record CODE: { int i; int len; SV ** s; HV * h; AV * av; struct MailAppInfo a; if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV)) RETVAL = record; else { doPackCategory(h, &a.category); if ((s = hv_fetch(h, "sortOrder", 9, 0))) a.sortOrder = SvList(*s, MailSortTypeNames); else a.sortOrder = 0; a.dirty = (s=hv_fetch(h,"dirty",5,0)) ? SvIV(*s) : 0; a.unsentMessage = (s=hv_fetch(h,"unsentMessage",13,0)) ? SvIV(*s) : 0; len = pack_MailAppInfo(&a, (CPTR)mybuf, 0xffff); RETVAL = newSVpv(mybuf, len); hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0); } } OUTPUT: RETVAL SV * UnpackSyncPref(record) SV * record CODE: { STRLEN len; AV * e; HV * ret; int i; struct MailSyncPref a; if (SvOK(record) && SvRV(record) && (SvTYPE(SvRV(record)) == SVt_PVHV)) { SV ** raw; ret = (HV*)SvRV(record); raw = hv_fetch(ret, "raw", 3, 0); if (!raw || !SvOK(*raw)) croak("Unable to unpack"); RETVAL = newSVsv(record); record = *raw; } else { ret = newHV(); hv_store(ret, "raw", 3, newSVsv(record),0); RETVAL = newRV_noinc((SV*)ret); } SvPV(record,len); if (unpack_MailSyncPref(&a, (CPTR)SvPV(record, na), len)>0) { hv_store(ret, "syncType", 8, newSVlist(a.syncType, MailSyncTypeNames), 0); hv_store(ret, "getHigh", 7, newSViv(a.getHigh), 0); hv_store(ret, "getContaining", 13, newSViv(a.getContaining), 0); hv_store(ret, "truncate", 8, newSViv(a.truncate), 0); if (a.filterTo) hv_store(ret, "filterTo", 8, newSVpv(a.filterTo, 0), 0); if (a.filterFrom) hv_store(ret, "filterFrom", 10, newSVpv(a.filterFrom, 0), 0); if (a.filterSubject) hv_store(ret, "filterSubject", 13, newSVpv(a.filterSubject, 0), 0); } } OUTPUT: RETVAL SV * PackSyncPref(record, id) SV * record int id CODE: { int i; int len; SV ** s; HV * h; AV * av; struct MailSyncPref a; if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV)) RETVAL = record; else { if ((s = hv_fetch(h, "syncType", 8, 0))) a.syncType = SvList(*s, MailSyncTypeNames); else a.syncType = 0; a.getHigh = (s=hv_fetch(h,"getHigh",7,0)) ? SvIV(*s) : 0; a.getContaining = (s=hv_fetch(h,"getContaining",13,0)) ? SvIV(*s) : 0; a.truncate = (s=hv_fetch(h,"truncate",8,0)) ? SvIV(*s) : 0; a.filterTo = (s=hv_fetch(h,"filterTo",8,0)) ? SvPV(*s,na) : 0; a.filterFrom = (s=hv_fetch(h,"filterFrom",10,0)) ? SvPV(*s,na) : 0; a.filterSubject = (s=hv_fetch(h,"filterSubject",13,0)) ? SvPV(*s,na) : 0; len = pack_MailSyncPref(&a, (CPTR)mybuf, 0xffff); RETVAL = newSVpv(mybuf, len); hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0); } } OUTPUT: RETVAL SV * UnpackSignaturePref(record) SV * record CODE: { STRLEN len; AV * e; HV * ret; int i; struct MailSignaturePref a; if (SvOK(record) && SvRV(record) && (SvTYPE(SvRV(record)) == SVt_PVHV)) { SV ** raw; ret = (HV*)SvRV(record); raw = hv_fetch(ret, "raw", 3, 0); if (!raw || !SvOK(*raw)) croak("Unable to unpack"); RETVAL = newSVsv(record); record = *raw; } else { ret = newHV(); hv_store(ret, "raw", 3, newSVsv(record),0); RETVAL = newRV_noinc((SV*)ret); } SvPV(record,len); if (unpack_MailSignaturePref(&a, (CPTR)SvPV(record, na), len)>0) { if (a.signature) hv_store(ret, "signature", 9, newSVpv(a.signature, 0), 0); } } OUTPUT: RETVAL SV * PackSignaturePref(record, id) SV * record int id CODE: { int i; int len; SV ** s; HV * h; AV * av; struct MailSignaturePref a; if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV)) RETVAL = record; else { a.signature = (s=hv_fetch(h,"signature",9,0)) ? SvPV(*s,na) : 0; len = pack_MailSignaturePref(&a, (CPTR)mybuf, 0xffff); RETVAL = newSVpv(mybuf, len); hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0); } } OUTPUT: RETVAL MODULE = PDA::Pilot PACKAGE = PDA::Pilot int close(socket) int socket CODE: RETVAL = pi_close(socket); OUTPUT: RETVAL int write(socket, msg) int socket SV * msg CODE: { STRLEN len; SvPV(msg, len); RETVAL = pi_write(socket,SvPV(msg,na),len); } SV * read(socket, len) int socket int len CODE: { int result; if (len > sizeof(mybuf)) len = sizeof(mybuf); result = pi_read(socket, mybuf, len); if (result >=0) RETVAL = newSVpv(mybuf, result); else RETVAL = &sv_undef; } OUTPUT: RETVAL int socket(domain, type, protocol) int domain int type int protocol CODE: RETVAL = pi_socket(domain, type, protocol); OUTPUT: RETVAL int listen(socket, backlog) int socket int backlog CODE: RETVAL = pi_listen(socket, backlog); OUTPUT: RETVAL char * errorText(error) int error CODE: RETVAL = dlp_strerror(error); OUTPUT: RETVAL int bind(socket, sockaddr) int socket SV * sockaddr CODE: { struct pi_sockaddr a; HV * h; if ((h=(HV*)SvRV(sockaddr)) && (SvTYPE(SvRV(sockaddr))==SVt_PVHV)) { SV ** s; char * name; struct pi_sockaddr * a; if ((s = hv_fetch(h, "device", 6, 0))) name = SvPV(*s,na); else name = ""; a = calloc(1,sizeof(struct pi_sockaddr)+strlen(name)); strcpy(a->pi_device, name); a->pi_family = (s = hv_fetch(h, "family", 6, 0)) ? SvIV(*s) : 0; RETVAL = pi_bind(socket, (struct sockaddr*)a, sizeof(struct pi_sockaddr)+strlen(name)); } else { STRLEN len; void * c = SvPV(sockaddr, len); RETVAL = pi_bind(socket, (struct sockaddr*)c, len); } } OUTPUT: RETVAL int openPort(port) char * port CODE: { struct pi_sockaddr a; int socket = pi_socket(PI_AF_SLP, PI_SOCK_STREAM, PI_PF_PADP); strcpy(a.pi_device, port); a.pi_family = PI_AF_SLP; pi_bind(socket, (struct sockaddr*)&a, sizeof(a)); pi_listen(socket, 1); RETVAL = socket; } OUTPUT: RETVAL SV * accept(socket) int socket CODE: { struct pi_sockaddr a; int len = sizeof(struct pi_sockaddr); int result; result = pi_accept(socket, (struct sockaddr*)&a, &len); if (result < 0) { RETVAL = newSViv(result); } else { PDA__Pilot__DLP * x = malloc(sizeof(PDA__Pilot__DLP)); SV * sv = newSViv((IV)(void*)x); x->errnop = 0; x->socket = result; RETVAL = newRV(sv); SvREFCNT_dec(sv); sv_bless(RETVAL, gv_stashpv("PDA::Pilot::DLPPtr",0)); } } OUTPUT: RETVAL MODULE = PDA::Pilot PACKAGE = PDA::Pilot::DLP::DBPtr void DESTROY(db) PDA::Pilot::DLP::DB * db CODE: if (db->Class) SvREFCNT_dec(db->Class); if (db->handle) dlp_CloseDB(db->socket, db->handle); if (db->dbname) SvREFCNT_dec(db->dbname); SvREFCNT_dec(db->connection); free(db); int errno(self) PDA::Pilot::DLP::DB * self CODE: RETVAL = self->errnop; self->errnop = 0; OUTPUT: RETVAL MODULE = PDA::Pilot PACKAGE = PDA::Pilot::DLP::DBPtr SV * class(self, name=0) PDA::Pilot::DLP::DB * self SV * name CODE: { SV ** s = 0; HV * h; if (name) { STRLEN len; h = perl_get_hv("PDA::Pilot::DBClasses", 0); if (!h) croak("DBClasses doesn't exist"); if (SvOK(name)) { (void)SvPV(name,len); s = hv_fetch(h, SvPV(name,na), len, 0); } if (!s) s = hv_fetch(h, "", 0, 0); if (!s) croak("Default DBClass not defined"); SvREFCNT_inc(*s); if (self->Class) SvREFCNT_dec(self->Class); self->Class = *s; } RETVAL = newSVsv(self->Class); } OUTPUT: RETVAL Result close(self) PDA::Pilot::DLP::DB * self CODE: RETVAL = dlp_CloseDB(self->socket, self->handle); self->handle=0; OUTPUT: RETVAL Result setSortBlock(self, data) PDA::Pilot::DLP::DB * self SV * data CODE: { STRLEN len; void * c; PackSI; c = SvPV(data, len); RETVAL = dlp_WriteSortBlock(self->socket, self->handle, c, len); } OUTPUT: RETVAL SV * getAppBlock(self, len=0xffff, offset=0) PDA::Pilot::DLP::DB * self int len int offset PPCODE: { int result = dlp_ReadAppBlock(self->socket, self->handle, offset, mybuf, len); ReturnReadAI(mybuf, result); } SV * getSortBlock(self, len=0xffff, offset=0) PDA::Pilot::DLP::DB * self int len int offset PPCODE: { int result = dlp_ReadSortBlock(self->socket,self->handle, offset, mybuf, len); ReturnReadSI(mybuf, result); } Result setAppBlock(self, data) PDA::Pilot::DLP::DB * self SV * data CODE: { STRLEN len; void * c; PackAI; c = SvPV(data, len); RETVAL = dlp_WriteAppBlock(self->socket, self->handle, c, len); } OUTPUT: RETVAL Result purge(self) PDA::Pilot::DLP::DB * self CODE: RETVAL = dlp_CleanUpDatabase(self->socket, self->handle); OUTPUT: RETVAL Result resetFlags(self) PDA::Pilot::DLP::DB * self CODE: RETVAL = dlp_ResetSyncFlags(self->socket, self->handle); OUTPUT: RETVAL Result deleteCategory(self, category) PDA::Pilot::DLP::DB * self int category CODE: RETVAL = dlp_DeleteCategory(self->socket, self->handle, category); OUTPUT: RETVAL void newRecord(self, id=0, attr=0, cat=0) PDA::Pilot::DLP::DB * self SV * id SV * attr SV * cat PPCODE: { if (self->Class) { int count; PUSHMARK(sp); XPUSHs(self->Class); if (id) XPUSHs(id); if (attr) XPUSHs(attr); if (cat) XPUSHs(cat); PUTBACK; count = perl_call_method("record", G_SCALAR); SPAGAIN; if (count != 1) croak("Unable to create record"); } else { croak("Class not defined"); } } void newResource(self, type=0, id=0) PDA::Pilot::DLP::DB * self SV * type SV * id PPCODE: { if (self->Class) { int count; PUSHMARK(sp); XPUSHs(self->Class); if (type) XPUSHs(type); if (id) XPUSHs(id); PUTBACK; count = perl_call_method("resource", G_SCALAR); SPAGAIN; if (count != 1) croak("Unable to create record"); } else { croak("Class not defined"); } } void newAppBlock(self) PDA::Pilot::DLP::DB * self PPCODE: { if (self->Class) { int count; PUSHMARK(sp); XPUSHs(self->Class); PUTBACK; count = perl_call_method("appblock", G_SCALAR); SPAGAIN; if (count != 1) croak("Unable to create record"); } else { croak("Class not defined"); } } void newSortBlock(self) PDA::Pilot::DLP::DB * self PPCODE: { if (self->Class) { int count; PUSHMARK(sp); XPUSHs(self->Class); PUTBACK; count = perl_call_method("sortblock", G_SCALAR); SPAGAIN; if (count != 1) croak("Unable to create record"); } else { croak("Class not defined"); } } void newPref(self, id=0, version=0, backup=0, creator=0) PDA::Pilot::DLP::DB * self SV * id SV * version SV * backup SV * creator PPCODE: { if (!creator) { int count; PUSHMARK(sp); XPUSHs(self->Class); PUTBACK; count = perl_call_method("creator", G_SCALAR); SPAGAIN; if (count != 1) croak("Unable to get creator"); creator = POPs; PUTBACK; } if (self->Class) { int count; PUSHMARK(sp); XPUSHs(self->Class); if (creator) XPUSHs(creator); if (id) XPUSHs(id); if (version) XPUSHs(version); if (backup) XPUSHs(backup); PUTBACK; count = perl_call_method("pref", G_SCALAR); SPAGAIN; if (count != 1) croak("Unable to create record"); } else { croak("Class not defined"); } } void getRecord(self, index) PDA::Pilot::DLP::DB * self int index PPCODE: { int attr, category; unsigned long id; int size, result; result = dlp_ReadRecordByIndex(self->socket, self->handle, index, mybuf, &id, &size, &attr, &category); ReturnReadRecord(mybuf,size); } Result moveCategory(self, fromcat, tocat) PDA::Pilot::DLP::DB * self int fromcat int tocat CODE: RETVAL = dlp_MoveCategory(self->socket, self->handle, fromcat, tocat); OUTPUT: RETVAL Result deleteRecord(self, id) PDA::Pilot::DLP::DB * self unsigned long id CODE: RETVAL = dlp_DeleteRecord(self->socket, self->handle, 0, id); OUTPUT: RETVAL Result deleteRecords(self) PDA::Pilot::DLP::DB * self CODE: RETVAL = dlp_DeleteRecord(self->socket, self->handle, 1, 0); OUTPUT: RETVAL Result resetNext(self) PDA::Pilot::DLP::DB * self CODE: RETVAL = dlp_ResetDBIndex(self->socket, self->handle); OUTPUT: RETVAL int getRecords(self) PDA::Pilot::DLP::DB * self CODE: { int result = dlp_ReadOpenDBInfo(self->socket, self->handle, &RETVAL); if (result < 0) { RETVAL = -1; self->errnop = result; } } OUTPUT: RETVAL void getRecordIDs(self, sort=0) PDA::Pilot::DLP::DB * self int sort PPCODE: { recordid_t * id = (recordid_t*)mybuf; int result; int start; int count; int i; AV * list = newAV(); start = 0; for(;;) { result = dlp_ReadRecordIDList(self->socket, self->handle, sort, start, 0xFFFF/sizeof(recordid_t), id, &count); if (result < 0) { self->errnop = result; break; } else { for(i=0;isocket, self->handle, id, mybuf, &index, &size, &attr, &category); ReturnReadRecord(mybuf,size); } void getNextModRecord(self, category=-1) PDA::Pilot::DLP::DB * self int category PPCODE: { int size, result, attr, index; unsigned long id; if (category == -1) result = dlp_ReadNextModifiedRec(self->socket, self->handle, mybuf, &id, &index, &size, &attr, &category); else result = dlp_ReadNextModifiedRecInCategory(self->socket, self->handle, category, mybuf, &id, &index, &size, &attr); ReturnReadRecord(mybuf,size); } void getNextRecord(self, category) PDA::Pilot::DLP::DB * self int category PPCODE: { int size, result, attr, index; unsigned long id; result = dlp_ReadNextRecInCategory(self->socket, self->handle, category, mybuf, &id, &index, &size, &attr); ReturnReadRecord(mybuf,size); } unsigned long setRecord(self, data) PDA::Pilot::DLP::DB * self SV * data CODE: { STRLEN len; unsigned long id; int attr, category; int result; void * c; PackRecord; c = SvPV(data, len); result = dlp_WriteRecord(self->socket, self->handle, attr, id, category, c, len, &RETVAL); if (result<0) { RETVAL = 0; self->errnop = result; } } OUTPUT: RETVAL unsigned long setRecordRaw(self, data, id, attr, category) PDA::Pilot::DLP::DB * self unsigned long id int attr int category SV * data CODE: { STRLEN len; int result; void * c; PackRaw; c = SvPV(data, len); result = dlp_WriteRecord(self->socket, self->handle, attr, id, category, c, len, &RETVAL); if (result<0) { RETVAL = 0; self->errnop = result; } } OUTPUT: RETVAL void setResourceByID(self, type, id) PDA::Pilot::DLP::DB * self Char4 type int id PPCODE: { int size, result, index; result = dlp_ReadResourceByType(self->socket, self->handle, type, id, mybuf, &index, &size); ReturnReadResource(mybuf,size); } void getResource(self, index) PDA::Pilot::DLP::DB * self int index PPCODE: { int size, result, id; Char4 type; result = dlp_ReadResourceByIndex(self->socket, self->handle, index, mybuf, &type, &id, &size); ReturnReadResource(mybuf,size); } SV * setResource(self, data) PDA::Pilot::DLP::DB * self SV * data CODE: { STRLEN len; int result; Char4 type; int id; void * c; PackResource; c = SvPV(data, len); result = dlp_WriteResource(self->socket, self->handle, type, id, c, len); if (result < 0) { self->errnop = result; RETVAL = newSVsv(&sv_undef); } else RETVAL = newSViv(result); } OUTPUT: RETVAL Result deleteResource(self, type, id) PDA::Pilot::DLP::DB * self Char4 type int id CODE: RETVAL = dlp_DeleteResource(self->socket, self->handle, 0, type, id); OUTPUT: RETVAL Result deleteResources(self) PDA::Pilot::DLP::DB * self CODE: RETVAL = dlp_DeleteResource(self->socket, self->handle, 1, 0, 0); OUTPUT: RETVAL void getPref(self, id=0, backup=1) PDA::Pilot::DLP::DB * self int id int backup PPCODE: { Char4 creator; int len, version, result; SV * c, n, v; int r; if (self->Class) { int count; PUSHMARK(sp); XPUSHs(self->Class); PUTBACK; count = perl_call_method("creator", G_SCALAR); SPAGAIN; if (count != 1) croak("Unable to get creator"); creator = SvChar4(POPs); PUTBACK; } if (pi_version(self->socket)< 0x101) r = dlp_CloseDB(self->socket, self->handle); result = dlp_ReadAppPreference(self->socket, creator, id, backup, 0xFFFF, mybuf, &len, &version); if (pi_version(self->socket)< 0x101) r = dlp_OpenDB(self->socket, self->dbcard, self->dbmode, SvPV(self->dbname,na), &self->handle); ReturnReadPref(mybuf, len); } SV * setPref(self, data) PDA::Pilot::DLP::DB * self SV * data PPCODE: { Char4 creator; int id; int version; int backup; STRLEN len; int result; void * buf; int r; PackPref; buf = SvPV(data, len); if (pi_version(self->socket)< 0x101) r = dlp_CloseDB(self->socket, self->handle); result = dlp_WriteAppPreference(self->socket, creator, id, backup, version, buf, len); if (pi_version(self->socket)< 0x101) r = dlp_OpenDB(self->socket, self->dbcard, self->dbmode, SvPV(self->dbname,na), &self->handle); if (result < 0) { self->errnop = result; RETVAL = newSVsv(&sv_undef); } else { RETVAL = newSViv(result); } } SV * setPrefRaw(self, data, number, version, backup=1) PDA::Pilot::DLP::DB * self SV * data int number int version int backup PPCODE: { STRLEN len; Char4 creator; int version, result; void * buf; PackRaw; buf = SvPV(data, len); if (self->Class) { int count; PUSHMARK(sp); XPUSHs(self->Class); PUTBACK; count = perl_call_method("creator", G_SCALAR); SPAGAIN; if (count != 1) croak("Unable to get creator"); creator = SvChar4(POPs); PUTBACK; } result = dlp_WriteAppPreference(self->socket, creator, number, backup, version, buf, len); if (result < 0) { self->errnop = result; RETVAL = newSVsv(&sv_undef); } else { RETVAL = newSViv(result); } } MODULE = PDA::Pilot PACKAGE = PDA::Pilot::DLPPtr void DESTROY(self) PDA::Pilot::DLP * self CODE: if (self->socket) pi_close(self->socket); free(self); int errno(self) PDA::Pilot::DLP * self CODE: RETVAL = self->errnop; self->errnop = 0; OUTPUT: RETVAL SV * getTime(self) PDA::Pilot::DLP * self CODE: { time_t t; int result = dlp_GetSysDateTime(self->socket, &t); if (result < 0) { self->errnop = result; RETVAL = newSVsv(&sv_undef); } else RETVAL = newSViv(t); } OUTPUT: RETVAL Result setTime(self, time) PDA::Pilot::DLP * self long time CODE: RETVAL = dlp_SetSysDateTime(self->socket, time); OUTPUT: RETVAL SV * getSysInfo(self) PDA::Pilot::DLP * self CODE: { struct SysInfo si; int result = dlp_ReadSysInfo(self->socket, &si); if (result < 0) { self->errnop = result; RETVAL = newSVsv(&sv_undef); } else { HV * i = newHV(); hv_store(i, "romVersion", 10, newSViv(si.romVersion), 0); \ hv_store(i, "locale", 6, newSViv(si.locale), 0); \ hv_store(i, "name", 4, newSVpv(si.name, si.nameLength), 0); \ RETVAL = newRV((SV*)i); } } OUTPUT: RETVAL SV * getCardInfo(self, cardno=0) PDA::Pilot::DLP * self int cardno CODE: { struct CardInfo c; int result = dlp_ReadStorageInfo(self->socket, cardno, &c); if (result < 0) { self->errnop = result; RETVAL = newSVsv(&sv_undef); } else { HV * i = newHV(); hv_store(i, "card", 6, newSViv(c.card), 0); \ hv_store(i, "version", 7, newSViv(c.version), 0); \ hv_store(i, "created", 8, newSViv(c.creation), 0); \ hv_store(i, "romSize", 7, newSViv(c.romSize), 0); \ hv_store(i, "ramSize", 7, newSViv(c.ramSize), 0); \ hv_store(i, "ramFree", 7, newSViv(c.ramFree), 0); \ hv_store(i, "name", 4, newSVpv(c.name,0), 0); \ hv_store(i, "manufacturer", 12, newSVpv(c.manufacturer,0), 0); \ RETVAL = newRV((SV*)i); } } OUTPUT: RETVAL int setUserInfo(self, info) PDA::Pilot::DLP * self UserInfo &info CODE: RETVAL = dlp_WriteUserInfo(self->socket, &info); OUTPUT: RETVAL void getBattery(self) PDA::Pilot::DLP * self PPCODE: { int warn, critical, ticks, kind, AC; unsigned long voltage; int result; struct RPC_params p; PackRPC(&p,0xA0B6, RPC_IntReply, RPC_Byte(0), RPC_ShortPtr(&warn), RPC_ShortPtr(&critical), RPC_ShortPtr(&ticks), RPC_BytePtr(&kind), RPC_BytePtr(&AC), RPC_End); result = dlp_RPC(self->socket, &p, &voltage); if (result==0) { EXTEND(sp,5); PUSHs(sv_2mortal(newSVnv((float)voltage/100))); PUSHs(sv_2mortal(newSVnv((float)warn/100))); PUSHs(sv_2mortal(newSVnv((float)critical/100))); PUSHs(sv_2mortal(newSViv(kind))); PUSHs(sv_2mortal(newSViv(AC))); } } SV * getUserInfo(self) PDA::Pilot::DLP * self CODE: { UserInfo info; int result; result = dlp_ReadUserInfo(self->socket, &info); pack_userinfo(RETVAL, info, result); } OUTPUT: RETVAL void newPref(self, creator, id=0, version=0, backup=0) PDA::Pilot::DLP * self Char4 creator SV * id SV * version SV * backup PPCODE: { HV * h = perl_get_hv("PDA::Pilot::PrefClasses", 0); SV ** s; int count; if (!h) croak("PrefClasses doesn't exist"); s = hv_fetch(h, printlong(creator), 4, 0); if (!s) s = hv_fetch(h, "", 0, 0); if (!s) croak("Default PrefClass not defined"); PUSHMARK(sp); XPUSHs(newSVsv(*s)); XPUSHs(&sv_undef); XPUSHs(sv_2mortal(newSVChar4(creator))); if (id) XPUSHs(id); if (version) XPUSHs(version); if (backup) XPUSHs(backup); PUTBACK; count = perl_call_method("pref", G_SCALAR); SPAGAIN; if (count != 1) croak("Unable to create resource"); } Result delete(self, name, cardno=0) PDA::Pilot::DLP * self char * name int cardno CODE: { UserInfo info; int result; RETVAL = dlp_DeleteDB(self->socket, cardno, name); } OUTPUT: RETVAL SV * open(self, name, mode=0, cardno=0) PDA::Pilot::DLP * self char * name SV * mode int cardno CODE: { int handle; int nummode; int result; if (!mode) nummode = dlpOpenRead|dlpOpenWrite|dlpOpenSecret; else { char *c; STRLEN len; nummode = SvIV(mode); if (SvPOKp(mode)) { c = SvPV(mode, len); while (*c) { switch (*c) { case 'r': nummode |= dlpOpenRead; break; case 'w': nummode |= dlpOpenWrite; break; case 'x': nummode |= dlpOpenExclusive; break; case 's': nummode |= dlpOpenSecret; break; } c++; } } } result = dlp_OpenDB(self->socket, cardno, nummode, name, &handle); if (result<0) { self->errnop = result; RETVAL = &sv_undef; } else { int type; PDA__Pilot__DLP__DB * x = malloc(sizeof(PDA__Pilot__DLP__DB)); SV * sv = newSViv((IV)(void*)x); SvREFCNT_inc(ST(0)); x->connection = ST(0); x->socket = self->socket; x->handle = handle; x->errnop = 0; x->dbname = newSVpv(name,0); x->dbmode = nummode; x->dbcard = cardno; RETVAL = newRV(sv); SvREFCNT_dec(sv); sv_bless(RETVAL, gv_stashpv("PDA::Pilot::DLP::DBPtr",0)); { HV * h = perl_get_hv("PDA::Pilot::DBClasses", 0); SV ** s; if (!h) croak("DBClasses doesn't exist"); s = hv_fetch(h, name, strlen(name), 0); if (!s) s = hv_fetch(h, "", 0, 0); if (!s) croak("Default DBClass not defined"); x->Class = *s; SvREFCNT_inc(*s); } } } OUTPUT: RETVAL SV * create(self, name, creator, type, flags, version, cardno=0) PDA::Pilot::DLP * self char * name Char4 creator Char4 type int flags int version int cardno CODE: { int handle; int result = dlp_CreateDB(self->socket, creator, type, cardno, flags, version, name, &handle); if (result<0) { self->errnop = result; RETVAL = &sv_undef; } else { PDA__Pilot__DLP__DB * x = malloc(sizeof(PDA__Pilot__DLP__DB)); SV * sv = newSViv((IV)(void*)x); SvREFCNT_inc(ST(0)); x->connection = ST(0); x->socket = self->socket; x->handle = handle; x->errnop = 0; x->dbname = newSVpv(name,0); x->dbmode = dlpOpenRead|dlpOpenWrite|dlpOpenSecret; x->dbcard = cardno; RETVAL = newRV(sv); SvREFCNT_dec(sv); sv_bless(RETVAL, gv_stashpv("PDA::Pilot::DLP::DBPtr",0)); { HV * h = perl_get_hv("PDA::Pilot::DBClasses", 0); SV ** s; if (!h) croak("DBClasses doesn't exist"); s = hv_fetch(h, name, strlen(name), 0); if (!s) s = hv_fetch(h, "", 0, 0); if (!s) croak("Default DBClass not defined"); x->Class = *s; SvREFCNT_inc(*s); } } } OUTPUT: RETVAL void getPref(self, creator, id=0, backup=1) PDA::Pilot::DLP * self Char4 creator int id int backup PPCODE: { int len, version, result; SV * c, n, v; result = dlp_ReadAppPreference(self->socket, creator, id, backup, 0xFFFF, mybuf, &len, &version); ReturnReadPref(mybuf, len); } SV * setPref(self, data) PDA::Pilot::DLP * self SV * data PPCODE: { Char4 creator; int id; int version; int backup; STRLEN len; int result; void * buf; PackPref; buf = SvPV(data, len); result = dlp_WriteAppPreference(self->socket, creator, id, backup, version, buf, len); if (result < 0) { self->errnop = result; RETVAL = newSVsv(&sv_undef); } else { RETVAL = newSViv(result); } } SV * setPrefRaw(self, data, creator, number, version, backup=1) PDA::Pilot::DLP * self SV * data Char4 creator int number int version int backup PPCODE: { STRLEN len; int version, result; void * buf; PackRaw; buf = SvPV(data, len); result = dlp_WriteAppPreference(self->socket, creator, number, backup, version, buf, len); if (result < 0) { self->errnop = result; RETVAL = newSVsv(&sv_undef); } else { RETVAL = newSViv(result); } } Result close(self, status=0) PDA::Pilot::DLP * self int status CODE: RETVAL = dlp_EndOfSync(self->socket, status) || pi_close(self->socket); if (!RETVAL) self->socket = 0; OUTPUT: RETVAL Result abort(self) PDA::Pilot::DLP * self CODE: RETVAL = dlp_AbortSync(self->socket) || pi_close(self->socket); if (!RETVAL) self->socket = 0; OUTPUT: RETVAL Result reset(self) PDA::Pilot::DLP * self CODE: RETVAL = dlp_ResetSystem(self->socket); OUTPUT: RETVAL Result getStatus(self) PDA::Pilot::DLP * self CODE: RETVAL = dlp_OpenConduit(self->socket); OUTPUT: RETVAL Result log(self, message) PDA::Pilot::DLP * self char * message CODE: RETVAL = dlp_AddSyncLogEntry(self->socket,message); OUTPUT: RETVAL Result dirty(self) PDA::Pilot::DLP * self CODE: RETVAL = dlp_ResetLastSyncPC(self->socket); OUTPUT: RETVAL SV * getDBInfo(self, start, RAM=1, ROM=0, cardno=0) PDA::Pilot::DLP * self int start int RAM int ROM int cardno CODE: { DBInfo info; int where = (RAM ? dlpDBListRAM : 0) | (ROM ? dlpDBListROM : 0); int result = dlp_ReadDBList(self->socket, cardno, where, start, &info); pack_dbinfo(RETVAL, info, result); } OUTPUT: RETVAL SV * findDBInfo(self, start, name, creator, type, cardno=0) PDA::Pilot::DLP * self int start SV * name SV * creator SV * type int cardno CODE: { DBInfo info; Char4 c,t; int result; if (SvOK(creator)) c = SvChar4(creator); else c = 0; if (SvOK(type)) t = SvChar4(type); else t = 0; result = dlp_FindDBInfo(self->socket, cardno, start, SvOK(name) ? SvPV(name,na) : 0, t, c, &info); pack_dbinfo(RETVAL, info, result); } OUTPUT: RETVAL SV * getFeature(self, creator, number) PDA::Pilot::DLP * self Char4 creator int number CODE: { unsigned long f; int result; if ((result = dlp_ReadFeature(self->socket, creator, number, &f))<0) { RETVAL = newSVsv(&sv_undef); self->errnop = result; } else { RETVAL = newSViv(f); } } OUTPUT: RETVAL void callApplication(self, creator, type, action, data=&sv_undef, maxretlen=0xFFFF) PDA::Pilot::DLP * self Char4 creator Char4 type int action SV * data int maxretlen PPCODE: { unsigned long retcode; STRLEN len; int result; (void)SvPV(data,len); result = dlp_CallApplication(self->socket, creator, type, action, len, SvPV(data,na), &retcode, maxretlen, (int *)&len, mybuf); EXTEND(sp, 2); if (result >= 0) { PUSHs(sv_2mortal(newSVpv(mybuf, len))); if (GIMME != G_SCALAR) { PUSHs(sv_2mortal(newSViv(retcode))); } } else PUSHs(&sv_undef); } int tickle(self) PDA::Pilot::DLP * self CODE: { RETVAL = pi_tickle(self->socket); } OUTPUT: RETVAL int watchdog(self, interval) PDA::Pilot::DLP * self int interval CODE: { RETVAL = pi_watchdog(self->socket, interval); } OUTPUT: RETVAL MODULE = PDA::Pilot PACKAGE = PDA::Pilot::File PDA::Pilot::File * open(name) char * name CODE: { RETVAL = calloc(sizeof(PDA__Pilot__File),1); RETVAL->errnop = 0; RETVAL->pf = pi_file_open(name); { HV * h = perl_get_hv("PDA::Pilot::DBClasses", 0); SV ** s; if (!h) croak("DBClasses doesn't exist"); s = hv_fetch(h, name, strlen(name), 0); if (!s) s = hv_fetch(h, "", 0, 0); if (!s) croak("Default DBClass not defined"); RETVAL->Class = *s; SvREFCNT_inc(*s); } } OUTPUT: RETVAL PDA::Pilot::File * create(name, info) char * name DBInfo info CODE: RETVAL = calloc(sizeof(PDA__Pilot__File),1); RETVAL->errnop = 0; RETVAL->pf = pi_file_create(name, &info); { HV * h = perl_get_hv("PDA::Pilot::DBClasses", 0); SV ** s; if (!h) croak("DBClasses doesn't exist"); s = hv_fetch(h, name, strlen(name), 0); if (!s) s = hv_fetch(h, "", 0, 0); if (!s) croak("Default DBClass not defined"); RETVAL->Class = *s; SvREFCNT_inc(*s); } OUTPUT: RETVAL MODULE = PDA::Pilot PACKAGE = PDA::Pilot::FilePtr int errno(self) PDA::Pilot::File * self CODE: RETVAL = self->errnop; self->errnop = 0; OUTPUT: RETVAL void DESTROY(self) PDA::Pilot::File * self CODE: if (self->pf) pi_file_close(self->pf); if (self->Class) SvREFCNT_dec(self->Class); free(self); SV * class(self, name=0) PDA::Pilot::File * self SV * name CODE: { SV ** s = 0; HV * h; if (name) { STRLEN len; h = perl_get_hv("PDA::Pilot::DBClasses", 0); if (!h) croak("DBClasses doesn't exist"); if (SvOK(name)) { (void)SvPV(name, len); s = hv_fetch(h, SvPV(name, na), len, 0); } if (!s) s = hv_fetch(h, "", 0, 0); if (!s) croak("Default DBClass not defined"); SvREFCNT_inc(*s); if (self->Class) SvREFCNT_dec(self->Class); self->Class = *s; } RETVAL = newSVsv(self->Class); } OUTPUT: RETVAL int close(self) PDA::Pilot::File * self CODE: if (self->pf) { RETVAL = pi_file_close(self->pf); self->pf = 0; } else RETVAL = 0; OUTPUT: RETVAL SV * getAppBlock(self) PDA::Pilot::File * self PPCODE: { int len, result; void * buf; result = pi_file_get_app_info(self->pf, &buf, &len); ReturnReadAI(buf, len); } SV * getSortBlock(self) PDA::Pilot::File * self PPCODE: { int len, result; void * buf; result = pi_file_get_sort_info(self->pf, &buf, &len); ReturnReadSI(buf, len); } SV * getRecords(self) PDA::Pilot::File * self CODE: { int len, result; result = pi_file_get_entries(self->pf, &len); if (result) { self->errnop = result; RETVAL = &sv_undef; } else RETVAL = newSViv(len); } OUTPUT: RETVAL SV * getResource(self, index) PDA::Pilot::File * self int index CODE: { int len, result, id; Char4 type; void * buf; result = pi_file_read_resource(self->pf, index, &buf, &len, &type, &id); ReturnReadResource(buf,len); } OUTPUT: RETVAL SV * getRecord(self, index) PDA::Pilot::File * self int index PPCODE: { int len, result, attr, category; unsigned long id; void * buf; result = pi_file_read_record(self->pf, index, &buf, &len, &attr, &category, &id); ReturnReadRecord(buf,len); } SV * getRecordByID(self, id) PDA::Pilot::File * self unsigned long id CODE: { int len, result; int attr, category, index; void * buf; result = pi_file_read_record_by_id(self->pf, id, &buf, &len, &index, &attr, &category); ReturnReadRecord(buf, len); } OUTPUT: RETVAL int checkID(self, uid) PDA::Pilot::File * self unsigned long uid CODE: RETVAL = pi_file_id_used(self->pf, uid); OUTPUT: RETVAL SV * getDBInfo(self) PDA::Pilot::File * self CODE: { DBInfo result; int err = pi_file_get_info(self->pf, &result); pack_dbinfo(RETVAL, result, err); } OUTPUT: RETVAL int setDBInfo(self, info) PDA::Pilot::File * self DBInfo info CODE: RETVAL = pi_file_set_info(self->pf, &info); OUTPUT: RETVAL int setAppBlock(self, data) PDA::Pilot::File * self SV * data CODE: { STRLEN len; char * c; PackAI; c = SvPV(data, len); RETVAL = pi_file_set_app_info(self->pf, c, len); } OUTPUT: RETVAL int setSortBlock(self, data) PDA::Pilot::File * self SV * data CODE: { STRLEN len; char * c; PackSI; c = SvPV(data, len); RETVAL = pi_file_set_sort_info(self->pf, c, len); } OUTPUT: RETVAL int addResource(self, data, type, id) PDA::Pilot::File * self SV * data Char4 type int id CODE: { STRLEN len; int result; void * buf; PackResource; buf = SvPV(data, len); RETVAL = pi_file_append_resource(self->pf, buf, len, type, id); } OUTPUT: RETVAL int addRecord(self, data) PDA::Pilot::File * self SV * data CODE: { STRLEN len; unsigned long id; int attr, category; int result; void * buf; PackRecord; buf = SvPV(data, len); RETVAL = pi_file_append_record(self->pf, buf, len, attr, category, id); } OUTPUT: RETVAL int addRecordRaw(self, data, uid, attr, category) PDA::Pilot::File * self SV * data unsigned long uid int attr int category CODE: { STRLEN len; int result; void * buf; PackRaw; buf = SvPV(data, len); RETVAL = pi_file_append_record(self->pf, buf, len, attr, category, uid); } OUTPUT: RETVAL int install(self, socket, cardno) PDA::Pilot::File * self PDA::Pilot::DLP * socket int cardno CODE: RETVAL = pi_file_install(self->pf, socket->socket, cardno); OUTPUT: RETVAL int retrieve(self, socket, cardno) PDA::Pilot::File * self PDA::Pilot::DLP * socket int cardno CODE: RETVAL = pi_file_retrieve(self->pf, socket->socket, cardno); OUTPUT: RETVAL plucker-1.8/parser/perl/modules/README0100644000076400001440000000105006751113057016632 0ustar mickeusers As of 0.8.0: Any documentation included is dubious at best. This is an experimental piece of code to interface Perl 5 to the pilot-link library. To use it, you will need to perform these steps: perl Makefile.PL make If everything is working, you can "make install" as root to install this interface system-wide. You can try "make test" before that. (Note that I have only tested this with Perl 5.004, though I have no reason to believe it won't work with earlier or later versions.) For documentation (such as it is), please read test.pl. plucker-1.8/parser/perl/modules/dump.pl0100644000076400001440000000043006751113057017255 0ustar mickeusers#!/usr/bin/perl use PDA::Pilot; use Data::Dumper; $socket = PDA::Pilot::openPort("/dev/cua3"); print "Now press the HotSync button\n"; $dlp = PDA::Pilot::accept($socket); $db = $dlp->open("DatebookDB"); $i=0; while(defined($r = $db->getRecord($i++))) { print Dumper($r); } plucker-1.8/parser/perl/modules/test.pl0100644000076400001440000000410506751113057017272 0ustar mickeuserssub FooBar { print "Foo: $_[0]\n"; $x = $_[0]; $x =~ s/[aeiou]/\U$&/g; return $x }; use PDA::Pilot; use Data::Dumper; if ($ARGV[0]) { $port = $ARGV[0]; } else { print "What port should I use [/dev/cua3]: "; $port = ; chop $port; $port ||= "/dev/cua3"; } $socket = PDA::Pilot::openPort($port); # OpenPort is the equivalent of # #$socket = PDA::Pilot::socket(PI_AF_SLP, PI_SOCK_STREAM, PI_PF_PADP); # #PDA::Pilot::bind($socket, # {family => PI_AF_SLP, device => $port}); # #PDA::Pilot::listen($socket, 1); print "Now press the HotSync button\n"; $dlp = PDA::Pilot::accept($socket); $PDA::Pilot::UnpackPref{mail}->{3} = sub { $_[0] . "x"}; @pref = $dlp->getPref('mail', 3); @pref = "Not available" if not defined $pref[0]; print "Mail preferences: @pref\n"; $ui = $dlp->getUserInfo; @b = $dlp->getBattery; $i = $dlp->getDBInfo(0); print Dumper($i); print "Battery voltage is $b[0], (warning marker $b[1], critical marker $b[2])\n"; $dlp->tickle; $db = $dlp->open("MemoDB"); print "db class is ", ref $db, "\n"; $r = $db->getRecord(0); print "Contents: '$r->{text}'\n"; $app = $db->getAppBlock; print Dumper($app); print "Categories: @{$app->{categoryName}}\n"; print Dumper($db->getPref(0)); print Dumper($db->getPref(1)); $db->close(); $db = $dlp->open("DatebookDB"); print "db class is ", ref $db, "\n"; $r = $db->getRecord(0); print "Contents: ", Dumper($r); $app = $db->getAppBlock; print Dumper($app); print "Categories: @{$app->{categoryName}}\n"; $db->close(); $db = $dlp->open("MailDB"); if ($db) { print "db class is ", ref $db, "\n"; $r = $db->getRecord(0); print "Contents: ", Dumper($r); $app = $db->getAppBlock; print Dumper($app); print "Categories: @{$app->{categoryName}}\n"; $db->close(); } $db = $dlp->open("ExpenseDB"); if ($db) { print "db class is ", ref $db, "\n"; $r = $db->getRecord(0); print "Contents: ", Dumper($r); $app = $db->getAppBlock; print Dumper($app); print "Categories: @{$app->{categoryName}}\n"; } undef $db; # Close database undef $dlp; # Close connection print "Your name is $ui->{name}\n"; plucker-1.8/parser/perl/modules/Artistic0100644000076400001440000001373706751113052017471 0ustar mickeusers The "Artistic License" Preamble The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. Definitions: "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder as specified below. "Copyright Holder" is whoever is named in the copyright or copyrights for the package. "You" is you, if you're thinking about copying or distributing this Package. "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. 1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. 2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. 3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as uunet.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. b) use the modified Package only within your corporation or organization. c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. d) make other distribution arrangements with the Copyright Holder. 4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. b) accompany the distribution with the machine-readable source of the Package with your modifications. c) give non-standard executables non-standard names, and clearly document the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. d) make other distribution arrangements with the Copyright Holder. 5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. You may embed this Package's interpreter within an executable of yours (by linking); this shall be construed as a mere form of aggregation, provided that the complete Standard Version of the interpreter is so embedded. 6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whoever generated them, and may be sold commercially, and may be aggregated with this Package. If such scripts or library files are aggregated with this Package via the so-called "undump" or "unexec" methods of producing a binary executable image, then distribution of such an image shall neither be construed as a distribution of this Package nor shall it fall under the restrictions of Paragraphs 3 and 4, provided that you do not represent such an executable image as a Standard Version of this Package. 7. C subroutines (or comparably compiled subroutines in other languages) supplied by you and linked into this Package in order to emulate subroutines and variables of the language defined by this Package shall not be considered part of this Package, but are the equivalent of input as in Paragraph 6, provided these subroutines do not change the language in any way that would cause it to fail the regression tests for the language. 8. Aggregation of this Package with a commercial distribution is always permitted provided that the use of this Package is embedded; that is, when no overt attempt is made to make this Package's interfaces visible to the end user of the commercial distribution. Such use shall not be construed as a distribution of this Package. 9. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. 10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. The End plucker-1.8/parser/perl/modules/typemap0100644000076400001440000000173406751113060017357 0ustar mickeusersTYPEMAP PDA::Pilot::File * T_PTROBJ PDA::Pilot::DLP * T_PTROBJ PDA::Pilot::DLP::DB * T_PTROBJ PDA::Pilot::DLP::ResourceDB * T_PTROBJ PDA::Pilot::DLP::RecordDB * T_PTROBJ DlpDB T_PTROBJ DBInfo T_DBInfo UserInfo T_UserInfo Char4 T_CHAR4 Result T_RESULT INPUT T_DBInfo unpack_dbinfo($arg, $var); T_UserInfo unpack_userinfo($arg, $var); T_CHAR4 { if (SvIOKp($arg) || SvNOKp($arg)) $var = SvIV($arg); else { STRLEN len; char * c = SvPV($arg, len); $var = makelong(c); } } T_PTROBJ if (sv_derived_from($arg, \"${ntype}\")) { IV tmp = SvIV((SV*)SvRV($arg)); $var = ($type) tmp; } else croak(\"$var is not of type ${ntype}\") OUTPUT T_DBInfo pack_dbinfo($arg, $var, 0); T_UserInfo pack_userinfo($arg, $var, 0); T_CHAR4 { char * c = printlong($var); sv_setpvn($arg, c, 4); } T_RESULT if ($var < 0) { sv_setsv($arg, &sv_no); self->errnop = $var; } else sv_setsv($arg, &sv_yes); T_PTROBJ sv_setref_pv($arg, \"${ntype}\", (void*)$var); plucker-1.8/parser/perl/modules/REQUIRED0100644000076400001440000000560707024747213017132 0ustar mickeusersHere's a brief listing of the required modules required for the perl parser to work and their CPAN locations. CPAN is your friend! ---------------------------------------------------------------------- Module id = HTML::LinkExtor DESCRIPTION Extract links from HTML documents CPAN_USERID GAAS (Gisle Aas ) CPAN_VERSION 1.19 CPAN_FILE GAAS/HTML-Parser-2.25.tar.gz DSLI_STATUS RmpO (released,mailing-list,perl,object-oriented) MANPAGE HTML::LinkExtor - Extract links from an HTML document INST_FILE /usr/lib/perl5/site_perl/5.005/HTML/LinkExtor.pm INST_VERSION 1.19 ftp://ftp-mirror.internap.com/pub/CPAN/authors/id/GAAS/HTML-Parser-2.25.tar.gz ---------------------------------------------------------------------- Module id = LWP::UserAgent DESCRIPTION A WWW UserAgent class CPAN_USERID GAAS (Gisle Aas ) CPAN_VERSION 1.69 CPAN_FILE GAAS/libwww-perl-5.47.tar.gz DSLI_STATUS RmpO (released,mailing-list,perl,object-oriented) MANPAGE LWP::UserAgent - A WWW UserAgent class INST_FILE /usr/lib/perl5/site_perl/5.005/LWP/UserAgent.pm INST_VERSION 1.69 ftp://ftp-mirror.internap.com/pub/CPAN/authors/id/GAAS/libwww-perl-5.47.tar.gz ---------------------------------------------------------------------- Module id = HTML::Parser DESCRIPTION Basic HTML Parser CPAN_USERID GAAS (Gisle Aas ) CPAN_VERSION 2.25 CPAN_FILE GAAS/HTML-Parser-2.25.tar.gz DSLI_STATUS RmpO (released,mailing-list,perl,object-oriented) MANPAGE HTML::Parser - HTML tokenizer INST_FILE /usr/lib/perl5/site_perl/5.005/HTML/Parser.pm INST_VERSION 2.25 ftp://ftp-mirror.internap.com/pub/CPAN/authors/id/GAAS/HTML-Parser-2.25.tar.gz ---------------------------------------------------------------------- Module id = HTML::TokeParser DESCRIPTION Alternative HTML::Parser interface CPAN_USERID GAAS (Gisle Aas ) CPAN_VERSION 2.07 CPAN_FILE GAAS/HTML-Parser-2.25.tar.gz DSLI_STATUS RmpO (released,mailing-list,perl,object-oriented) MANPAGE HTML::TokeParser - Alternative HTML::Parser interface INST_FILE /usr/lib/perl5/site_perl/5.005/HTML/TokeParser.pm INST_VERSION 2.07 ftp://ftp-mirror.internap.com/pub/CPAN/authors/id/GAAS/HTML-Parser-2.25.tar.gz ---------------------------------------------------------------------- Module id = URI::URL DESCRIPTION Uniform Resource Locator objects CPAN_USERID GAAS (Gisle Aas ) CPAN_VERSION 5.02 CPAN_FILE GAAS/URI-1.04.tar.gz DSLI_STATUS RmpO (released,mailing-list,perl,object-oriented) MANPAGE URI::URL - Uniform Resource Locators INST_FILE /usr/lib/perl5/site_perl/5.005/URI/URL.pm INST_VERSION 5.02 ftp://ftp-mirror.internap.com/pub/CPAN/authors/id/GAAS/URI-1.04.tar.gz ---------------------------------------------------------------------- plucker-1.8/parser/perl/modules/Makefile.PL.in0100644000076400001440000000077206751113052020336 0ustar mickeusersuse ExtUtils::MakeMaker; # See lib/ExtUtils/MakeMaker.pm for details of how to influence # the contents of the Makefile that is written. $prefix = "@prefix@"; $exec_prefix = "@exec_prefix@"; $libdir = "@libdir@"; unless ((-e "$libdir/libpisock.la") or (-e "$libdir/libpisock.a")) { die "pilot-link must be installed before PDA::Pilot can be built\n"; } $lib = "-L$libdir -lpisock"; WriteMakefile( 'NAME' => 'PDA::Pilot', 'VERSION' => '0.1', 'LIBS' => $lib, 'INC' => '-I../include', ); plucker-1.8/parser/perl/modules/MANIFEST0100644000076400001440000000010606751113052017077 0ustar mickeusersMANIFEST Makefile.PL Pilot.pm Pilot.xs README dump.pl test.pl typemap plucker-1.8/parser/perl/parser/0040755000076400001440000000000010052664567015613 5ustar mickeusersplucker-1.8/parser/perl/parser/plucker-os2-11201999.pl0100755000076400001440000005345707127430524021242 0ustar mickeusers#!/usr/bin/perl # # THIS IS NON-STABLE BETA CODE # ####################################### # Note: certain changes will be needed for win32/other compatibility, like # binmode i # calls and tricks like: # eval "exec /usr/local/bin/perl -S $0 $*" if 0; # and the %0.bat stuff for the archaic OSes... # ..when there is time... ####################################### # # filename: pluckit # usage: ./pluckit [[root_url] maxdepth] # # i.e. ./pluckit http://www.cia.gov 2 # # "Go Pluck yourself!" # # [debug] output: # # plucking [405P/861p/611c] n32 (3d/3m) # http://home.global.co.za/~kitiara/tsasa/ # 1. 2. 3. 4. 5. 6. 7. # where: # # 1. parent of the page currently being parsed # 2. current value of $page (which decides the record number of a document) # 3. current number of @PLUCKME (the number of pages left to pluck) # 4. number of documents in @docs (good parses) # 5. current depth of page in 6. # 6. max depth of page in 6. # 7. the (parent) URL being plucked # # ..and.. # # DUPE CONTENT: (21p->13o) http://lisa.title14.com/random/ # 1. 2. 3. # where: # # 1. the parent page that has the duplicate link on it # 2. the original page where the content can be found # 3. the link in question # # ..and.. # # Cannot fetch http://lisa.title14.com/random/Weekly%20Status%204b.doc # (status 200 [application/msword] OK) # # where: # # 1. link that was not a) successfully returned from server OR b) not a # valid 'type' (see &parse_type) # 2. status returned from server # 3. MIME type # 4. response message # # ----------------------------------------------------------------------- # the usual suspects: use HTML::LinkExtor; use LWP::UserAgent; use HTML::Parser; use HTML::TokeParser; use URI::URL; # ----------------------------------------------------------------------- # ----------------------------------------------------------------------- # Initial setup # ----------------------------------------------------------------------- my $verbose = 0; my $pluckerhome = "$ENV{HOME}/.plucker"; my $debug_dir = "$pluckerhome/.debug"; # ----------------------------------------------------------------------- # These two directories exist under ~/.plucker. cache holds the binary files for # sync.pl to pick up and assemble, and ./html contains the raw html files that # are brought down from the web. Both will probably be removed as this script # evolves to the point where the writing to disk is no longer required. my $crawler_dir = "$pluckerhome/html"; my $cache_dir = "$pluckerhome/cache"; # ----------------------------------------------------------------------- # ----------------------------------------------------------------------- # This is passed to the remote server as the connecting UserAgent string my $user_agent = "Plucker/0.05 [en] PalmOS(tm)/EPOC"; # ----------------------------------------------------------------------- my $home_url = "$pluckerhome/home.html"; my $error_url = "$pluckerhome/error.html"; my $external_url = "$pluckerhome/external.html"; my $mailto_url = "$pluckerhome/mailto.html"; my $page = 11; # index number start.. first root_url will be this my $start_id = 11; # starting ID for root my $logfile = "$pluckerhome/pluckit.log"; # logs start, dupes and end/summary # if not in ARGV[0] my $default_root = "file://$home_url"; # if not in ARGV[0] my $localdate = localtime(); # ----------------------------------------------------------------------- # An array containing all the (good) URLs plucked (therefore all hash # names) this will be used when writing the data out to .pdb/sync/whatever # format my @documents; my @PLUCKME; # ----------------------------------------------------------------------- # ----------------------------------------------------------------------- # Tempfile needed by TokeParser, but only on OS/2 # my $plktmp = ($^O eq 'os2' && 'E:/temp/plucker.tmp'); if ($^O eq 'os2') { my $plktmp = ("$ENV{TMP}/plucker.tmp" || "$ENV{TEMP}/plucker.tmp" || "$ENV{TMPDIR}/plucker.tmp") or die "Hey, set TMP= something, silly!\n"; my $cache_dir = "./cache"; } # ----------------------------------------------------------------------- # ----------------------------------------------------------------------- # These set up the 'browser' environment that the servers we hit will see us as... # (nice addition for proxy hits) $ua = new LWP::UserAgent; $ua->agent("$user_agent"); $ua->env_proxy; # ----------------------------------------------------------------------- # ----------------------------------------------------------------------- # $p will hold content of the body my $p =""; # ----------------------------------------------------------------------- # ----------------------------------------------------------------------- # Determine the os from the perl version parsing this script. # # $^O The name of the operating system under which this # copy of Perl was built, as determined during the # configuration process. The value is identical to # $Config{'osname'}. my $os = $^O; # ----------------------------------------------------------------------- # ###################### # # Plucker API (well..) # # All content is held in hashes. each hashes name is the URL. all hash names # are held in @docs. subs can access the plucked data once the MAIN loop is # done. each hash has the following keys: # ----------------------------------------------------------------------- # The actual URL that was plucked (and the name of this hash). # ex: http://www.whitehouse.gov/pics/monica/intimate/cigar.gif # url [URL] # ----------------------------------------------------------------------- # Was this page plucked ok? # ok [Y|N] was this page plucked ok? # ----------------------------------------------------------------------- # The of the page (non-image pages(data), that is..) # title [title] # ----------------------------------------------------------------------- # The parent URL that this page was linked from. Note: for root URL this # is the same as the key url (so you can find it later!) # parent [URL] # ----------------------------------------------------------------------- # The current depth of this document. 0=root page/file. # depth [depth] # ----------------------------------------------------------------------- # The depth (from root) that this page and all links from it must not exceed. # max_depth [max.depth] # ----------------------------------------------------------------------- # Is this page at maximum pluck depth? Essential when same pages plucked from # different parents. # at_max [Y|N] # ----------------------------------------------------------------------- # The _complete_ headers returned from the server. # headers [headers] # ----------------------------------------------------------------------- # The MIME type of the content returned (gotten from headers). # type [MIME type] # ----------------------------------------------------------------------- # The actual length (bytes) of content on the page (headers not included, # just content). # length [length] # ----------------------------------------------------------------------- # has this page been plucked? that is, have its links been plucked. # plucked [Y|N] # ----------------------------------------------------------------------- # The actual content of the link. raw data, picture, html, whatever.. # content [content] # # NOTE: everything to do with paragraphs and headers in various database # formats is taken care of AFTER the actual plucking is over. this # is why those things required are not listed here. do them in # the subs where that format is relevant. # ###################### # # it begins.. note: "parent" is the current URL, "child" links are derived from the parent.. # # Flush STDOUT $| = 1; &logit(" START of logfile on $localdate"); # keep all initial setup controlled from here &setup; # #-----------------------------------------------------------------------------# MAIN: while ($parent = shift @PLUCKME) { # print "A doing $parent\n"; $parent = &fix_url($parent); # fix up the URL itself as necessary if ($did{$parent}++) { # builds visited urls keys, # times=value &logit("\n\tDuplicate Content:\n\tIgnored [$did{$parent}] $parent\n\n"); warn "DUPE url: $parent\n" if $verbose >= 3; next MAIN; # Add more here to direct parent to original (sole) content (hmm...) } if ($bad{$parent}) { # don't bother, its bad(tm)... &logit("BAD $parent"); warn "BAD url: $parent\n" if $verbose >= 3; next MAIN; # restart loop, its BAD(tm)! } if ($parent ne "$root_url" && ($$parent{depth} >= ($$parent{max_depth} + 1))) { &logit("MAX DEPTH [$$parent{depth}] $parent"); warn "MAX DEPTH [$$parent{depth}\/$$parent{max_depth}] url: $parent\n" if $verbose >= 3; next MAIN; } # the above tests should be in this order: dupe, bad, max_depth # ----------------------------------------------------------------------- # this is where you start to work with a valid parent.. # needed to know hash names when writing DB push @docs, $parent; # ----------------------------------------------------------------------- # how many docs are in the array? $num_docs = @docs; # ----------------------------------------------------------------------- # how many docs have yet to be checked? $check_count = @PLUCKME; # ----------------------------------------------------------------------- # This pass is the first pass of the script (root URL). In here, we set the # url for the root url, which identifies this as the parent. We could also # try to match $root_url later, if it makes sense at that time. if ($num_docs == 1) { $$parent{url} = $parent; $$parent{parent} = $parent; $$Parent{depth} = 0; } # ----------------------------------------------------------------------- # warn "plucking [", $$parent{parent}, "\P\/$page\p/", $check_count,"c] # n$num_docs ($$parent{depth}d\/$$parent{max_depth}m) $parent\n"; # # legend: P = parent, p = pageID, c = # of @PLUCKME elements, # n = number of docs in @docs, d = parent depth, m = parent max depth # # time to build a request oject.. use $parent to write first doc and find links # $request = new HTTP::Request(GET,$parent); # build request $response = $ua->request($request); # Pluckit! # ----------------------------------------------------------------------- # now, what to do with the request? might be good, might be bad.. # ----------------------------------------------------------------------- if ($response->is_success && ($$parent{type} = &parse_type($response->content_type))) { $$parent{plucked} = "Y"; # get/set type my $everything = $response->as_string; # COMPLETE response ($headers = $everything) =~ s#(.*?)\n\n.*#$1#s; # pull headers $$parent{headers} = $headers; # store headers ($body = $everything) =~ s#.*?\n\n(.*)#$1#s; # pull body $base = $response->base; # base url for $parent $$parent{ok} = "Y"; # success! } else { # Bad(tm) request! warn "Cannot fetch $parent (status ", $response->code, " [", $response->content_type, "] ", $response->message,")\n"; $$parent{ok} = "N"; # may need status later.. $bad{$parent}++; # its bad(tm)... next MAIN; # no use staying here.. } # ----------------------------------------------------------------------- # so, you have an image.. no use parsing for links, eh? # ----------------------------------------------------------------------- if ($parent_type =~ /image/) { $$parent{content} = $body; # put image into a scalar.. can mangle/convert later! :) ($$parent{length} = $headers) =~ s#.*?Content-Length: (.*?)\n.*#$1#s; # set size of image (bytes) &write_debug($parent); # for debug, write to the $crawler_dir # need more here.. next MAIN; # move along... no need to parse } # ----------------------------------------------------------------------- # you are in a REAL document now... ready to parse it.. (look for links and load PLUCKME) # ----------------------------------------------------------------------- if ($os eq "os2") { open (TMP, ">$plktmp"); # OS/2 needs this tempfile, sorry. print TMP $body; close TMP; $p = HTML::TokeParser->new($plktmp); # load $body up! } else { $p = HTML::TokeParser->new(\$body); # load $body up! } # print "B got body!\n"; # ----------------------------------------------------------------------- # a word about HTML::Tokeparser... # 0 1 2 3 4 $token->[?] # ["S", $tag, %$attr, @$attrseq, $origtext] # Start # ----------------------------------------------------------------------- my ($text, $parsed_body); while (my $token = $p->get_token) { # traverse body my $rel_url; # used with $base to make an absolute url my $tag_id = $token->[0]; # [S,E,T,C,D] see HTML::TokeParser my $tag_text = $token->[1]; # href, img, ... if ($tag_id eq "S"){ # Start tag if (grep { /\A$tag_text\Z/ } @tags_links) { # hyperlinks my $key; foreach $key ( keys %{$token->[2]} ) { # print "C doing \'$key\' \n"; if ( $key =~ /href|src/ ) { $rel_url = %$token->[2]{$key}; ### print "\tKEY: \'$key\' VALUE: \'$rel_url\' "; } elsif ( $key =~ /maxdepth/i ) { # got bored.. my $child_url = URI->new_abs($rel_url, $base); $child_max_depth = %$token->[2]{$key}; } else { } } my $child = fix_url(URI->new_abs($rel_url, $base)); # print "D got child: $child \n"; $child = "$child"; if ($did{$child}){ # make our mark that we've been there, done that.. # -this is really nice, as it will even point to content that # hasn't been plucked yet, but is in the @PLUCKME queue next MAIN; # no use in overwriting %$child, it exists already } $$child{url} = $child; # not a dupe, so assign it.. $$child{parent} = $$parent{url}; # who loves ya.. $$child{depth} = $$parent{depth} + 1; # max + 1 if ( $child_max_depth ) { $$child{max_depth} = $child_max_depth; # from a home.html, or..? } else { $$child{max_depth} = $$parent{max_depth}; # clone max_depth } $$child{at_max} = "Y" if $$child{depth} >= $$child{max_depth}; # makes sense.. push @PLUCKME, $child; # this $child needs plucking! # if not a hypertext link, then what to do with it? } else { grep { /\A$tag_text\Z/ } "title"; # page title unless ($$parent{title}){ # only add if page has no title yet $$parent{title} = $p->get_trimmed_text; } } # end of if (grep { /\A$tag_text\Z/ } @tags_links).. } # end of if (tag_id eq "S"... (start tag) } # end of while (my $token... $$parent{length} = length($parsed_text); # will need later.. $$parent{content} = $text; &debug($$parent{url}); # write debug files } # end of while($parent = shift... # ----------------------------------------------------------------------- # end it.. take it all into whatever format is desired print "YOU ARE OUTPUTTING DATA!\n"; &output_data; # ----------------------------------------------------------------------- &logit("Summary:"); &logit("Plucked $page pages"); $did_count = keys %did; &logit("$did_count links"); $bad_count = keys %bad; &logit("$bad_count bad links"); &logit(" END."); # ----------------------------------------------------------------------- # now that all parsing is complete, dump from memory (to whatever format...) # all urls are in @documents, and each hash (doc) is named in @documents # # NOT IMPLEMENTED NOW... # # ----------------------------------------------------------------------- sub output_data { # currently to cache directory.. but can be anywhere. my $output = "$cache_dir/$file"; open OUTPUT, ">$output"; printf OUTPUT '%8c', $blength, $blengthm, # body length/256 and /256 modulus 0, $offset_data, # padding lsbs: (needed) (1byte) (2byte) 0, 0, # height (used by viewer, not parser) $pplength, $pplengthm; # prev para length/256, /256 modulus printf OUTPUT '%s', $body; my @html_types = ("text/html", "text/plain"); # what makes an html? my @image_types = ("image/gif"); # what makes an image? $$out{title} = $$parent{title}; # if (grep { /$type/ } @html_types) { $doc_type = 0; } elsif (grep { /$type/ } @image_types) { $doc_type = 1; } else { print "UNKNOWN TYPE: $type\n"; } # write the document header printf OUTPUT '%20c', # 20 bytes in the header 0, 20, # document header length $header_size1,$header_size2, # doc hdr + (# of paras * 8) /256, %256 $doc_text1, $doc_text2, # uncomp size of all para text 0, 0, # Y-origin of document (i.e. top of document on screen) 0, 20, # Location of 1st para within document 0, 0, # Y-location of 1st visible para (on/off screen) 0, 0, # Location of last para in doc. (Calculated in viewer) 0, 0, # Y-location of last para (calculated in viewer) 0, 0, # Height of document (pixels - calculated in viewer) 0, $doc_type; # Content-type. 0=html, 1=image, 2=comp \ close OUTPUT; } # end of sub output_data # ----------------------------------------------------------------------- # parse the raw url before it is plucked.. # convert characters, OS specific, ... # ----------------------------------------------------------------------- sub fix_url { my $rawurl = shift; $rawurl =~ s/%7e/~/ig; # convert ascii tildes to real ones $rawurl =~ s/(.*?)\#\w*/$1/ig; # strips fragments YUK!!! return $rawurl; } # ----------------------------------------------------------------------- # per RFC 2396 (and perldoc URI): # # <scheme>:<scheme-specific-part>#<fragment> # <scheme>://<authority><path>?<query>#<fragment> # <path>?<query>#<fragment> # ----------------------------------------------------------------------- # debug output.. makes dirs in $debug_dir with the URL as the name of the file.. # i know its weird, but the only way to do it pre-parsing that is useful.. # ----------------------------------------------------------------------- sub debug { my $out = shift; $outgood = $out; $outgood =~ s#/#_#g; my $output = "$debug_dir/$outgood"; print "Debugging $out now!!! to ($output)\n"; open DEBUG, ">$output"; print DEBUG "URL: ", $$out{url},"\n"; print DEBUG "OK: ", $$out{ok},"\n"; print DEBUG "TITLE: ", $$out{title},"\n"; print DEBUG "PARENT: ", $$out{parent},"\n"; print DEBUG "DEPTH: ", $$out{depth},"\n"; print DEBUG "MAX_DEPTH: ", $$out{max_depth},"\n"; print DEBUG "AT MAX DEPTH: ", $$out{at_max},"\n"; print DEBUG "HEADERS: ", $$out{headers},"\n"; print DEBUG "TYPE: ", $$out{type},"\n"; print DEBUG "LENGTH: ", $$out{length},"\n"; print DEBUG "PLUCKED: ", $$out{plucked},"\n"; print DEBUG "CONTENT: ", $$out{content},"\n"; close DEBUG; } # ----------------------------------------------------------------------- # initial setup controlled from here # ----------------------------------------------------------------------- sub setup { if ($ARGV[0]) { $root_url = $ARGV[0]; } else { $root_url = "$default_root"; # default.. home.html } push @PLUCKME, $root_url; # loads fist url (home.html)? if ( $ARGV[1] ) { $$root_url{max_depth} = $ARGV[1]; # how deep to drill (fix later..) } else { $$root_url{max_depth} = 3; # how deep to drill (fix later..) } if ( -e $debug_dir ) { unlink <$debug_dir/*>; print " I just removed all files from $debug_dir\n"; } else { mkdir($debug_dir, 0755); print " I just created $debug_dir\n"; } @tags_links = qw(a img); # what makes a valid link? } # ----------------------------------------------------------------------- # used to create log entries # logit("this is an entry"); # ----------------------------------------------------------------------- sub logit { my $entry = shift; my $date_now = localtime(); open LOG, ">>$logfile"; print LOG $date_now, " $entry\n"; close LOG; } # ----------------------------------------------------------------------- # designed to only return a value if the mime type in the link is good(tm) # ..that is, a match for elements in @good_mime_types # ----------------------------------------------------------------------- sub parse_type { my $type = shift; @good_mime_types = ( "text/html", # good ole html "text/plain", # plain text "image/gif", # GIF "image/jpeg" # JPEG ); if (grep {/$type/ } @good_mime_types) { return $type; } else { return undef; } } # end of sub parse_type # ----------------------------------------------------------------------- �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������plucker-1.8/parser/perl/parser/README���������������������������������������������������������������0100644�0000764�0000144�00000003222�07140616065�016461� 0����������������������������������������������������������������������������������������������������ustar �micke���������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������2000-07-29 David A. Desrosiers <hacker@gnu-designs.com> Ok, after a long hiatus of me not working on the parser, here lies yet another complete rewrite from the ground up. This one is very *VERY* fast, has some new little tricks in it, and works very well. It's much faster in the gather process than the current Python parser is. ################### **** WARNING ****** ################### Although this parser is 100% stable, do not expect this to do everything the python parser does right now. My local copy does, but that one is not stable enough for production work. Basically this one will allow you to bring down web content and images up to --maxdepth, and then you can use the python parser with the file:/foo syntax to build you a proper database. Run it like this: perl ./plucke-rget.pl http://www.freshmeat.net/ --maxdepth=1 --verbose Feedback (and help fixing some of the buglets) is greatly appreciated. 1999-12-12 David A. Desrosiers <hacker@gnu-designs.com> I've added two copies of the parser here, so please feel free to help use fix them, and roll them into production use. They both have slightly different scanning/gathering engines, so try them both. 1999-07-24 David A. Desrosiers <hacker@gnu-designs.com> Ok, this is where the parser is going to make it's home. I'm going to be cleaning up the code very soon, just spending a lot of time porting some tools over, so I could build the viewer, and making the cvs server a tad more stable, and adding a web page for the cvs server. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������plucker-1.8/parser/perl/parser/plucker-lnx-12041999.pl����������������������������������������������0100755�0000764�0000144�00000051351�07127430524�021332� 0����������������������������������������������������������������������������������������������������ustar �micke���������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl # # THIS IS NON-STABLE BETA CODE # ####################################### # Note: certain changes will be needed for win32/other compatibility, like binmode i # calls and tricks like: # eval "exec /usr/local/bin/perl -S $0 $*" if 0; # and the %0.bat stuff for the archaic OSes... # ..when there is time... ####################################### # # filename: pluckit # usage: ./pluckit [[root_url] maxdepth] # # i.e. ./pluckit http://www.cia.gov 2 # # "Go Pluck yourself!" # # Pat Trainor <ptrainor@title14.com> # # output: # # plucking [405P/861p/611c] n32 (3d/3m) http://home.global.co.za/~kitiara/tsasa/ # 1. 2. 3. 4. 5. 6. 7. # where: # # 1. parent of the page currently being parsed # 2. current value of $page (which decides the record number of a document) # 3. current number of @CHECK (the number of pages left to pluck) # 4. number of documents in @docs (good parses) # 5. current depth of page in 6. # 6. max depth of page in 6. # 7. the (parent) URL being plucked # # ..and.. # # DUPE CONTENT: (21p->13o) http://lisa.title14.com/random/ # 1. 2. 3. # where: # # 1. the parent page that has the duplicate link on it # 2. the original page where the content can be found # 3. the link in question # # ..and.. # # Cannot fetch http://lisa.title14.com/random/Weekly%20Status%204b.doc (status 200 [application/msword] OK) # 1. 2. 3. 4. # where: # # 1. link that was not a) successfully returned from server OR b) not a valid 'type' (see &parse_type) # 2. status returned from server # 3. MIME type # 4. response message # ############## # # the usual suspects: # use HTML::LinkExtor; use LWP::UserAgent; use HTML::Parser; use HTML::TokeParser; use URI::URL; # # ----------------------------------------------------------------------- # Initial setup # ----------------------------------------------------------------------- my $verbose = 0; my $pluckerhome = "$ENV{HOME}/.plucker"; my $debug_dir = "$pluckerhome/.debug"; # ----------------------------------------------------------------------- # These two directories exist under ~/.plucker. cache holds the binary files for # sync.pl to pick up and assemble, and ./html contains the raw html files that # are brought down from the web. Both will probably be removed as this script # evolves to the point where the writing to disk is no longer required. my $crawler_dir = "$pluckerhome/html"; my $cache_dir = "$pluckerhome/cache"; # ----------------------------------------------------------------------- # ----------------------------------------------------------------------- # This is passed to the remote server as the connecting UserAgent string my $user_agent = "Plucker/0.05 [en] PalmOS(tm)/EPOC"; # ----------------------------------------------------------------------- my $home_url = "$pluckerhome/home.html"; my $error_url = "$pluckerhome/error.html"; my $external_url = "$pluckerhome/external.html"; my $mailto_url = "$pluckerhome/mailto.html"; my $page = 11; # index number start.. first root_url will be this my $start_id = 11; # starting ID for root my $logfile = "$pluckerhome/pluckit.log"; # logs start, dupes and end/summary # if not in ARGV[0] my $default_root = "file://$home_url"; # if not in ARGV[0] my $localdate = localtime(); # ----------------------------------------------------------------------- # An array containing all the (good) URLs plucked (therefore all hash # names) this will be used when writing the data out to .pdb/sync/whatever # format my @documents; my @PLUCKME; # ----------------------------------------------------------------------- # Tempfile needed by TokeParser, but only on OS/2 # my $plktmp = ($^O eq 'os2' && 'E:/temp/plucker.tmp'); if ($^O eq 'os2') { my $plktmp = ("$ENV{TMP}/plucker.tmp" || "$ENV{TEMP}/plucker.tmp" || "$ENV{TMPDIR}/plucker.tmp") or die "Hey, set TMP= something, silly!\n"; my $cache_dir = "./cache"; } # ----------------------------------------------------------------------- # ----------------------------------------------------------------------- # These set up the 'browser' environment that the servers we hit will see us as... # (nice addition for proxy hits) $ua = new LWP::UserAgent; $ua->agent("$user_agent"); $ua->env_proxy; # ----------------------------------------------------------------------- # ----------------------------------------------------------------------- # $p will hold content of the body my $p =""; # ----------------------------------------------------------------------- # ----------------------------------------------------------------------- # Determine the os from the perl version parsing this script. # # $^O The name of the operating system under which this # copy of Perl was built, as determined during the # configuration process. The value is identical to # $Config{'osname'}. my $os = $^O; # ----------------------------------------------------------------------- $| = 1; # flush STDOUT &logit("---------------- START of logfile on $localdate"); &setup; # ----------------------------------------------------------------------- MAIN: while ($parent = shift @CHECK) { $parent = &fix_url($parent); # fix up the URL itself as necessary ############# these tests should be consolidated later ############ if ($did{$parent}++) { # builds visited urls keys, # times=value &logit("\n\tDuplicate Content:\n\tIgnored [$did{$parent}] $parent\n\n"); ###warn "DUPE url: $parent\n"; next MAIN; # Add more here to direct parent to original (sole) content } if ($bad{$parent}) { # don't bother, its bad(tm)... &logit("BAD $parent"); ###warn "BAD url: $parent\n"; next MAIN; # restart loop, its BAD(tm)! } if ($parent ne "$root_url" && ($$parent{depth} >= ($$parent{max_depth} + 1))) { &logit("MAX DEPTH [$$parent{depth}] $parent"); ###warn "MAX DEPTH [$$parent{depth}\/$$parent{max_depth}] url: $parent\n"; next MAIN; } # the above tests should be in this order: dupe, bad, max_depth ################################################################### # this is where you start to work with a valid parent.. push @docs, $parent; # needed to know hash names when writing DB $num_docs = @docs; # how many docs are in the array? $check_count = @CHECK; # how many docs have yet to be checked? $$parent{url} = $parent; # set url $$parent{paras} = 1; # all docs have at least 1 paragraph if ($page == $start_id) { # $parent is home.html, or ... $$parent{depth} = "0"; $$parent{title} = "Plucker Home Page"; $$parent{parent} = $page; $$parent{id} = $page; $$parent{at_max} = "N"; } warn "plucking [", $$parent{parent}, "\P\/$page\p/", $check_count,"c] doc [$num_docs] ($$parent{depth}d\/$$parent{max_depth}m) $parent\n"; # legend: P = parent, p = pageID, c = # of @CHECK elements, # n = number of docs in @docs, d = parent depth, m = parent max depth $request = new HTTP::Request(GET,$parent); # build request $response = $ua->request($request); # Pluckit! if ($response->is_success && ($parent_type = &parse_type($response->content_type))) { $$parent{type} = $parent_type; # get/set type $$parent{plucked} = "Y"; # get/set type my $everything = $response->as_string; # COMPLETE response ($headers = $everything) =~ s#(.*?)\n\n.*#$1#s; # pull headers $$parent{headers} = $headers; # store headers ($body = $everything) =~ s#.*?\n\n(.*)#$1#s; # pull body $base = $response->base; # base url for $parent $$parent{ok} = "Y"; # success! } else { warn "Cannot fetch $parent (status ", $response->code, " [", $response->content_type, "] ", $response->message,")\n"; $$parent{ok} = "N"; # may need status later.. $bad{$parent}++; # its bad(tm)... next MAIN; # no use staying here.. } # so, you have an image.. 1 paragraph will do.. if ($parent_type =~ /image/) { $$parent{content} = $body; ($$parent{length} = $headers) =~ s#.*?Content-Length: (.*?)\n.*#$1#s; &write_debug($parent); # for debug, write to the $crawler_dir next MAIN; # move along... no need to parse } # you are in a real document now... ready to parse it.. (look for links and rewrite tags) my $p = HTML::TokeParser->new(\$body); # load $body up! # a word about HTML::Tokeparser... # 0 1 2 3 4 $token->[?] # ["S", $tag, %$attr, @$attrseq, $origtext] # Start # ["E", $tag, $origtext] # End # ["T", $text] # Text # ["C", $text] # Comment # ["D", $text] # Declaration # put any tags you want converted to text here in this hash (lc) # and they will be output (say, applet) as: [APPLET] %$p->{textify} = {applet => "alt"}; my ($text, $parsed_body); $para_count = 0; while (my $token = $p->get_token) { # traverse body my $rel_url; # used with $base to make an absolute url my $tag_id = $token->[0]; # [S,E,T,C,D] see HTML::TokeParser my $tag_text = $token->[1]; # href, img, ... if ($tag_id eq "S"){ # Start tag ### print "S: $tag_text\n"; if (grep { /\A$tag_text\Z/ } @tags_links) { # hyperlinks my $key; foreach $key ( keys %{$token->[2]} ) { ### print "doing \'$key\'\n"; if ( $key =~ /href|src/ ) { $rel_url = %$token->[2]{$key}; ### print "\tKEY: \'$key\' VALUE: \'$rel_url\' "; } elsif ( $key =~ /maxdepth/i ) { my $child_url = URI->new_abs($rel_url, $base); $child_max_depth = %$token->[2]{$key}; } else { # add more here... ### print "I don't know how to handle: \'$key \= ", %$token->[2]{$key}, "\'\n"; } } my $child = fix_url(URI->new_abs($rel_url, $base)); $child = "$child"; if ($did{$child}){ foreach $d (keys %{$child} ) { next unless $d eq "id"; print "$d is: ", ${$child}{$d}, "\n"; } print "Dupe: ($$parent{id}p\->$$child{id}\o) $child\n"; # p = parent o = original(only) content # point this page to the existing link ($$child{id}) # when we write the binaries here... # -this is really nice, as it will even point to content that # hasn't been plucked yet, but is in the @CHECK queue!!! next MAIN; # no use in overwriting %$child, it exists already } $$child{url} = $child; $page++; # make a new file/record id $$child{id} = $page; # set new id $$child{parent} = $$parent{id}; # who loves ya.. if (!$$parent{depth} && $parent ne "$root_url") { &logit("NO PARENT LINK_DEPTH: [$$parent{id}] $parent"); # should NEVER be true... remove when code calms down.. } $$child{depth} = $$parent{depth} + 1; # max + 1 if ( $child_max_depth ) { $$child{max_depth} = $child_max_depth; } else { $$child{max_depth} = $$parent{max_depth}; # clone max_depth } $$child{at_max} = "Y" if $$child{depth} >= $$child{max_depth}; push @CHECK, $child; # if not a hypertext link, then what to do with it? } elsif (grep { /\A$tag_text\Z/ } @tags_crs ) { # carriage returns $text .= "<\_$tag_text\_>"; # well, for debugging.. } elsif (grep { /\A$tag_text\Z/ } @tags_para ) { # make paragraphs $text .= "<\_$tag_text\_>"; # well, for debugging.. } elsif (grep { /\A$tag_text\Z/ } @tags_ignore ) { # ignore these.. $text .= "<\_$tag_text\_>"; # well, for debugging.. } elsif (grep { /\A$tag_text\Z/ } @tags_1 ) { # size=1 $text .= "<\_$tag_text\_>"; # well, for debugging.. } elsif (grep { /\A$tag_text\Z/ } @tags_2 ) { # size=2 $text .= "<\_$tag_text\_>"; # well, for debugging.. } elsif (grep { /\A$tag_text\Z/ } @tags_3 ) { # size=3 $text .= "<\_$tag_text\_>"; # well, for debugging.. } elsif (grep { /\A$tag_text\Z/ } @tags_4 ) { # size=4 $text .= "<\_$tag_text\_>"; # well, for debugging.. } elsif (grep { /\A$tag_text\Z/ } @tags_5 ) { # size=5 $text .= "<\_$tag_text\_>"; # well, for debugging.. } elsif (grep { /\A$tag_text\Z/ } @tags_6 ) { # size=6 $text .= "<\_$tag_text\_>"; # well, for debugging.. } elsif (grep { /\A$tag_text\Z/ } @tags_7 ) { # size=7 $text .= "<\_$tag_text\_>"; # well, for debugging.. } elsif (grep { /\A$tag_text\Z/ } "title" ) { # page title $text .= "<\_$tag_text\_>"; # well, for debugging.. unless ($$parent{title}){ #$parent_title = $p->get_trimmed_text; # use page's #$$parent{title} = $parent_title; # title if none #$p->unget_token("title"); # } } else { ### print ">->->-> I don't know how to handle: $tag_text\n"; } } elsif ($tag_id eq "E") { # end tag my $origtext = $token->[2]; $text .= "<\_\/$tag_text\_>"; # well, for debugging.. ### print "E: \'$tag_text\' \'$origtext\'\n"; #$text .= $origtext; # adds END tokens } elsif ($tag_id eq "T") { # text $text .= "_\_$tag_text\__" unless !$tag_text; # well, for debugging.. my $origtext = $token->[2]; ### print "T: \'$tag_text\' \'$origtext\'\n"; } elsif ($tag_id eq "C") { # comment $text .= "<\_$tag_text\_>"; # well, for debugging.. my $origtext = $token->[2]; ### print "C: \'$tag_text\' \'$origtext\'\n"; } elsif ($tag_id eq "D") { # declaration $text .= "<\_$tag_text\_>"; # well, for debugging.. my $origtext = $token->[2]; ### print "D: \'$tag_text\' \'$origtext\'\n"; } else { # shouldn't get here... ### print "W A R N I N G ! LEFTOVER TAGID: $tag_id TEXT: $text\n"; } # end of if (tag_id eq "S"... $text .= $token->[4]; # add ORIGINAL TAGS to $text #$text .= $p->get_trimmed_text; # text n/associated with tokens } # end of while (my $token... $text =~ s#[\n\r]##sg; # remove source \n\r's my $parsed_text .= "$text "; # adds ONLY text between tags!!! $$parent{length} = length($parsed_text); # will need later.. $$parent{content} = cleanup($parsed_text);# load content &write_debug($parent); # for debug, write to the $crawler_dir } # end of while($parent = shift... # ######### # # end it.. # &output_data; # take it all into whatever format is desired # ########### &logit("Summary:"); &logit("Plucked $page pages"); $did_count = keys %did; &logit("$did_count links"); $bad_count = keys %bad; &logit("$bad_count bad links"); &logit("------------- END."); # #--------------------------------------------------------------whew!---------------# # ###################### # # now that all parsing is complete, dump from memory (to whatever format...) # all urls are in @documents, and each hash (doc) is named in @documents # sub output_data { # currently to cache directory.. but can be anywhere.. #forearch $doc (@documents) { # step through each document printf OUTPUT '%8c', $blength, $blengthm, # body length/256 and /256 modulus 0, $offset_data, # padding lsbs: (needed) (1byte) (2byte) 0, 0, # height (used by viewer, not parser) $pplength, $pplengthm; # prev para length/256, /256 modulus printf OUTPUT '%s', $body; my @html_types = ("text/html", "text/plain"); # what makes an html? my @image_types = ("image/gif"); # what makes an image? $$out{title} = $$parent{title}; # my $output = "$cache_dir/$file"; open OUTPUT, ">$output"; if (grep { /$type/ } @html_types) { $doc_type = 0; } elsif (grep { /$type/ } @image_types) { $doc_type = 1; } else { print "UNKNOWN TYPE: $type\n"; } # write the document header printf OUTPUT '%20c', # 20 bytes in the header 0, 20, # document header length $header_size1,$header_size2, # doc hdr + (# of paras * 8) /256, %256 $doc_text1, $doc_text2, # uncomp size of all para text 0, 0, # Y-origin of document (i.e. top of document on screen) 0, 20, # Location of 1st para within document 0, 0, # Y-location of 1st visible para (on/off screen) 0, 0, # Location of last para in doc. (Calculated in viewer) 0, 0, # Y-location of last para (calculated in viewer) 0, 0, # Height of document (pixels - calculated in viewer) 0, $doc_type; # Content-type. 0=html, 1=image, 2=comp \ close OUTPUT; ###} # end of foreach $doc ... } # end of sub output_data # ############ # # parse the raw url before it is plucked.. # sub fix_url { my $rawurl = shift; $rawurl =~ s/%7e/~/ig; # convert ascii tildes to real ones $rawurl =~ s/(.*?)\#\w*/$1/ig; # strips fragments YUK!!! return $rawurl; } # # per RFC 2396 (and perldoc URI): # # <scheme>:<scheme-specific-part>#<fragment> # <scheme>://<authority><path>?<query>#<fragment> # <path>?<query>#<fragment> # ########## # # write files (html) # sub write_debug { my $out = shift; $$out{title} = $$parent{title}; # I have no idea why this works... :( my $output = "$crawler_dir/$$out{id}"; open DEBUG, ">$output"; print DEBUG "URL: ", $$out{url},"\n"; print DEBUG "OK: ", $$out{ok},"\n"; print DEBUG "TITLE: ", $$out{title},"\n"; print DEBUG "ID: ", $$out{id},"\n"; print DEBUG "PARENT: ", $$out{parent},"\n"; print DEBUG "DEPTH: ", $$out{depth},"\n"; print DEBUG "MAX_DEPTH: ", $$out{max_depth},"\n"; print DEBUG "AT MAX DEPTH: ", $$out{at_max},"\n"; print DEBUG "HEADERS: ", $$out{headers},"\n"; print DEBUG "TYPE: ", $$out{type},"\n"; print DEBUG "LENGTH: ", $$out{length},"\n"; print DEBUG "PLUCKED: ", $$out{plucked},"\n"; print DEBUG "PARAGRAPHS: ", $$out{paras},"\n"; print DEBUG "CONTENT: ", $$out{content},"\n"; close DEBUG; } # ########## # # initial setup controlled from here # sub setup { &get_roots; if ( -e $crawler_dir ) { unlink <$crawler_dir/*>; print " I just removed all files from $crawler_dir"; } else { mkdir($crawler_dir, 666); print " I just created $crawler_dir"; } if ( -e $cache_dir ) { unlink <$cache_dir/*>; print " and I just removed all files from $cache_dir\n"; } else { mkdir($cache_dir, 666); print " and I just created $cache_dir\n"; } @tags_links = qw(a img); @tags_crs = qw(ul li table th p br tr h1 h2 h3 h4 h5 h6 hr); @tags_para = qw(ul p h1 h2 h3 h4 h5 h6 hr); @tags_ignore = qw(b i ul head body html frame frameset center style meta); @tags_1 = qw(h1); @tags_2 = qw(h2); @tags_3 = qw(h3); @tags_4 = qw(h4); @tags_5 = qw(h5); @tags_6 = qw(h6); @tags_7 = qw(b); } # ########## # # determine root urls, and depth. replace with whatever will parse a config # file like home.html... # usage: &get_roots # sub get_roots { if ($ARGV[0]) { $root_url = $ARGV[0]; } else { $root_url = "$default_root"; # default.. home.html } push @CHECK, $root_url; # loads fist url (home.html)? if ( $ARGV[1] ) { $$root_url{max_depth} = $ARGV[1]; # how deep to drill (fix later..) } else { $$root_url{max_depth} = 3; # how deep to drill (fix later..) } } # end-o-sub # ########### # # mostly useful for logging, this returns a nice human date # $now = getdate(); # sub get_date { my $date_now = localtime(); return $date_now; } # ########### # # used to create log entries # logit("this is an entry"); # sub logit { my $entry = shift; open LOG, ">>$logfile"; print LOG &get_date, " $entry\n"; close LOG; } # ########### # # designed to only return a value if the mime type in the link is good(tm) # ..that is, a match for elements in @good_mime_types # sub parse_type { my $type = shift; @good_mime_types = ( "text/html", "text/plain", "image/gif" ); if (grep {/$type/ } @good_mime_types) { return $type; } else { return undef; } } # end of sub parse_type # ########### # # print out everything about the entry at that point # degug($parent), i.e. # sub debug { my $debug = shift; print "=" x 70, "\n"; print "URL: ", $$debug{url},"\n"; print "OK: ", $$debug{ok},"\n"; print "TITLE: ", $$debug{title},"\n"; print "ID: ", $$debug{id},"\n"; print "PARENT: ", $$debug{parent},"\n"; print "DEPTH: ", $$debug{depth},"\n"; print "MAX_DEPTH: ", $$debug{max_depth},"\n"; print "HEADERS: ", $$debug{headers},"\n"; print "TYPE: ", $$debug{type},"\n"; print "LENGTH: ", $$debug{length},"\n"; print "PLUCKED: ", $$debug{plucked},"\n"; print "CONTENT: ", $$debug{content},"\n"; print "=" x 70, "\n"; } # ############ # # clean out weird characters -ugh.. # sub cleanup { my $rawtext = shift; my %oddballs = ( ' ' => 1, '©' => 1, 'ü' => 1, 'Ü' => 1, 'ö' => 1, 'Ö' => 1, 'ä' => 1, 'Ä' => 1, 'ß' => 1, '&^;' => 1, '&;;' => 1 ); return $rawtext; } # ############ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������plucker-1.8/parser/defaults/������������������������������������������������������������������������0040755�0000764�0000144�00000000000�10052664564�015161� 5����������������������������������������������������������������������������������������������������ustar �micke���������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������plucker-1.8/parser/defaults/pluckerrc.sample��������������������������������������������������������0100644�0000764�0000144�00000024517�07624306111�020354� 0����������������������������������������������������������������������������������������������������ustar �micke���������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;; ;; This is a sample config file. ;; ;; Under OS/2 and Windows this should be called 'plucker.ini'. ;; For Windows, put this in the pluckerhome directory or in the ;; pluckerdir directory. ;; ;; Under unix, this should be called 'pluckerrc' if it is the system ;; wide config file and '.pluckerrc' if it is a user config file. ;; This should have been installed in the correct place. ;; ;; ;; Entries are key = value pairs ordered into section. A section is ;; named and begins with a line in square bracket, where the brackets ;; contain the section name. ;; ;; General entries can go into the [DEFAULT] section. ;; ;; Under Windows, the [WINDOWS] section is also searched. ;; Under OS/2 the [OS2] and [POSIX] sections are searched ;; Everywhere else [POSIX] is searched. ;; ;; -------------------------------------------------------------------- [DEFAULT] ;; ;; In the general section you can set the following items: ;; ;; ;; Verbosity level: ;; ;; 0 - silent except for errors ;; 1 - progress status ;; 2 - debugging ;; ;;verbosity = 1 ;; ;; Path to the plucker dir. ;; ;;pluckerdir = ;; ;; Name of the directory where cache files will be stored ;; (relative to pluckerdir) ;; ;;cache_dir_name = cache ;; ;; Document name ;; ;;doc_name = ;; ;; Filename for the document ;; ;;doc_file = ;; ;; Compression type ;; ;; doc - use the DOC compression (works on all supported versions) ;; zlib - use ZLib compression (doesn't work on 2.x devices) ;; ;; Zlib compression is typically much better than DOC compression. ;; ;;compression = doc ;; ;; Default category for the created document (you can assign several ;; categories separated by ';') ;; ;;category = Unfiled ;; ;; Document attributes ;; ;; If the copy prevention attribute is set it will not be ;; possible to beam a copy of the document to another device. ;; The backup attribute will indicate that the document should ;; be backed up (requires a desktop tool that checks this ;; attribute) and the launchable attribute will make the ;; document visible so that the user can tap on it to launch ;; the viewer with the selected document. ;; ;;copyprevention_bit = false ;;backup_bit = false ;;launchable_bit = false ;; ;; The URL to the document and the max depth to ;; spider this document. It is also possible to specify ;; that the spider should only follow links on the same ;; host (site) and/or fetch pages below the home URL ;; whose URLs starts with the given STAYBELOW value. ;; ;;home_url = plucker:/home.html ;;home_maxdepth = 2 ;;home_stayonhost = false ;;home_staybelow = ;; ;; Bits per pixel for images (0 to means 'no images') ;; ;;bpp = 1 ;; ;; Max width and height for the images. Alternative maximum width ;; and height can also be specified. These values are used for 'big' ;; versions of inlined images that had to be scaled down in size to ;; obey the maxwidth and maxheight parameters. ;; ;;maxwidth = 150 ;;maxheight = 250 ;;alt_maxwidth = ;;alt_maxheight = ;; ;; If an image is smaller or equal to the given limit (in bytes) ;; the image will not be compressed. ;; ;;image_compression_limit = 300 ;; Specify which parser to use to convert images. Defaults to ;; whatever the system determines to be the default parser. ;; ;; imagemagick - ImageMagick image parser ;; netpbm2 - NetPbm image parser ;; pil2 - PIL image parser ;; windows - Windows image parser ;; ;;image_parser = ;; ;; A string specifying a command to be executed before spidering. ;; ;;before_command = ;;before_command1 = ;; : ;;before_command9 = ;; ;; A string specifying a command to be executed after spidering. ;; ;;after_command = ;;after_command1 = ;; : ;;after_command9 = ;; ;; Store an icon in AppInfo block. If no big or small icons ;; are specified default icons will be used. ;; ;;icon = false ;;big_icon = ;;small_icon = ;; ;; Specify proxy (http://proxy:port) and username and password for ;; basic proxy authentication if that is used. The environment variables ;; HTTP_PROXY, HTTP_PROXY_USER and HTTP_PROXY_PASS will be used as ;; default values. ;; ;;http_proxy = ;;http_proxy_user = ;;http_proxy_pass = ;; ;; Specify a conversion program to convert Word Documents to HTML. ;; They will automagically be handled as HTML by the parser. ;; So far only wvWare is supported. ;; worddoc_converter = ;; ----------------------------------------------------------------- [POSIX] ;; In the POSIX section you can set the following items: ;; ;; Name (and maybe path) for the image tools: ;; ;;ppmquant_program = ppmquant ;;ppmtoTbmp_program = pnmtopalm ;;pnmscale_program = pnmscale ;;pnmfile_program = pnmfile ;;giftopnm_program = giftopnm ;;djpeg_program = djpeg ;;pngtopnm_program = pngtopnm ;;convert_program = convert ;; ;; Name (and maybe path) for the color maps used by ;; ppmquant: ;; ;;palm1bit_graymap_file = palmgray1.map ;;palm2bit_graymap_file = palmgray2.map ;;palm4bit_graymap_file = palmgray4.map ;;palm8bit_stdcolormap_file = palmcolor8.map ;; ;; List of filename specifying exclusion lists to be ;; inspected. Names are separated by colons. ;; ;;exclusion_lists = ;; ------------------------------------------------------------------- [OS2] ;; For OS/2, you can also set the following items: ;; ;; List of filename specifying exclusion lists to be ;; inspected. Names are separated by semicolons. ;; ;;exclusion_lists = ;; -------------------------------------------------------------------- [WINDOWS] ;; For Windows, you can also set the following items: ;; ;; List of filename specifying exclusion lists to be ;; inspected. Names are separated by semicolons. ;; ;;exclusion_lists = ;; ;; Name (and maybe path) for the ImageMagick convert tool ;; and the command line parameters. ;; ;;convert_program = convert.exe ;;convert_program_parameter = "%input% bmp:%output%" ;; ;; Name (and maybe path) for the Bmp2Tbmp tool and the ;; command line parameters. ;; ;;bmp_to_tbmp = Bmp2Tbmp.exe ;;bmp_to_tbmp_parameter = "-i=%input% -o=%output% -maxwidth=%maxwidth% -maxheight=%maxheight% -compress=%compress% -bpp=%colors%" ;; ;; Specify the value for the %compress% parameter. ;; ;;tbmp_compression_type = yes ;; ;; The following parameters can be specified for 'convert_program' and ;; 'bmp_to_tbmp': ;; ;; %compress% = will be equal to the 'tbmp_compression_type' key if ;; compression is used, otherwise 'no' ;; %colors% = '1', '2', '4' or '8' ;; %maxwidth% = maxwidth value ;; %maxheight% = maxheight value ;; %input% = the input filename ;; %output% = the output filename ;; ;; These keys control the way that the images are converted to the Palm Tbmp ;; format. ;; ;; The maximum size of an Tbmp bitmap is 60,000 bytes (before Plucker's ;; document compression); you can set the max_tbmp_size key to an lower ;; value to save memory on your device. ;; ;; The tbmp_compression key controls the internal Tbmp compression (not ;; related to Plucker's document compression); if set to true, the Tbmp's ;; are smaller, and you can use pictures that normally exceed the maximum ;; size (as set by max_tbmp_size). However, this will not work on all OS ;; versions; if your OS does not support this, the viewer will display a ;; warning message and not show the pictures. ;; ;; If a bitmap exceeds the maximum size, and try_reduce_bpp is set to ;; true, the parser will try to reduce the BPP (bits/pixel) until the ;; size is OK; if it's still too big with bpp=1, the dimension of the ;; bitmap will be reduced in 10% steps if the try_reduce_dimension key ;; is set. ;; ;; How big a Tbmp will be after a bpp or dimensions reduce are calculated, ;; but this won't work if you use tbmp compression. To still get the ;; maximum quality (highest possible bpp and size), set the guess_tbmp_size ;; to false. In this case the bitmap will be converted in every step ;; to get the resulting size. This could need some more time. ;; ;;max_tbmp_size = 60000 ;;tbmp_compression = no ;;try_reduce_bpp = true ;;try_reduce_dimension = true ;;guess_tbmp_size = true ;; ;; The following items are currently only used if the Installer is ;; used to setup the desktop tools: ;; ;; HotSync user name: ;; ;;user = ;; ;; Name (and maybe path) for the Python executable. ;; ;;python_program = ;; ;; Set close_on_exit to true to close the terminal window when PyPlucker ;; is finished. Set close_on_error to true to close the terminal windows ;; if the parser exit with an error. ;; ;;close_on_exit = false ;;close_on_error = false ;; ;; Specify if the conduit.exe should be use to build the PDB or ;; if PyPlucker should be used instead (only for debugging) ;; ;;use_conduit = true ;; ;; Play a sound when the spider finish building the document. ;; ;; Valid parameters: ;; ;; - Drive:\Path\Filename.wav : A filename (with full path) for a ;; WAV file. ;; ;; - *MELODY:<notes to play> : Playing a list of notes using the ;; computer speaker ;; ;; Format of <notes to play>: ;; ;; <note><octave><space><duration>|<note><octave><space><duration>|... ;; ;; <note> : One of [C;C#;D;D#;E;F;F#;G;G#;A;A#;H] or 'P' for Pause ;; <octave> : 2, 3, 4 or 5 ;; <space> : A space char (' ') ;; <duration> : The duration in 1/100 seconds ;; ;; - *BEEP : Standard beep using the computer speaker ;; ;; - *ICONASTERISK : System sound "SystemAsterisk" ;; ;; - *ICONEXCLAMATION : System sound "SystemExclamation" ;; ;; - *ICONHAND : System sound "SystemHand" ;; ;; - *ICONQUESTION : System sound "SystemQuestion" ;; ;; - *OK : System sound "SystemDefault" ;; ;; Example: ready_sound = "*MELODY:C5 18|A4 18|P 37|C5 18|A5 18|P 37|C5 18" ;; ;;ready_sound = ;; ;; Editor to use for HTML files. ;; ;;html_editor = "Notepad.exe %s" ;; ;; Editor to use for INI files. ;; ;;ini_editor = "Notepad.exe %s" ;; ;; Editor to use for text files. ;; ;;text_editor = "Notepad.exe %s" ;; ;; Program to use for HTML files stored on the web. (%s is ;; the placeholder for the path and filename for the file) ;; ;;url_editor = "%s" ;; ;; Program used to view HTML files (local and web). (%s is ;; the placeholder for the path and filename for the file) ;; ;;html_viewer = "%s" ;; ;; These items are only available in the 'MAIN' config file: ;; ;; Path to the Plucker Program Group. ;; ;;group_path = ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������plucker-1.8/parser/defaults/exclusionlist.txt�������������������������������������������������������0100644�0000764�0000144�00000006735�10021251426�020620� 0����������������������������������������������������������������������������������������������������ustar �micke���������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������## ## An example exclusion list. ## ## Leading and trailing white space is ignored. ## emty lines or lines starting with a '#' are considered comments ## everything else should be of the form: ## <prio>:<action>:<regexp> ## where: ## <prio>: is an integer (negative numbers are also valid) specifing ## the priority. Rules with higher priorities are considered ## before rules with lower priorities. Rules of equal priority ## are considered in the sequence that they appear in the file. ## <action>: is either a plus or a minus sign. Plus means 'include this ## document' while minus means 'do not include this document'. ## <regexp>: a valid regular expression (as known, e.g. from perl). ## Normally, the regexp is not case-sensitive, but ## neither is it Locale or unicode-aware. ## # most rules in this file have priority 0, so you can use easily # override things by using higher priorities. ## ---------------------------------------------------------------------- ## Ignore files that we know we cannot handle: ## 0:-:.*\.aiff$ # audio a problem, but email to Australia is OK. 1:+:.*@.*\.au$ 1:+:.*%40.*\.au$ 0:-:.*\.au$ 0:-:.*\.avi$ 0:-:.*\.bin$ 0:-:.*\.bz2$ 0:-:.*\.class$ # windows executables are a problem but email is OK 1:+:.*@.*\.com$ 1:+:.*%40.*\.com$ 0:-:.*\.com$ 0:-:.*\.exe$ 0:-:.*\.gz$ 0:-:.*\.hqx$ 0:-:.*\.map$ 0:-:.*\.mov$ 0:-:.*\.mpg$ 0:-:.*\.mp3$ 0:-:.*\.pac$ 0:-:.*\.pdf$ 0:-:.*\.ram$ 0:-:.*\.rar$ 0:-:.*\.rpm$ 0:-:.*\.sit$ 0:-:.*\.snd$ 0:-:.*\.tar$ 0:-:.*\.tgz$ 0:-:.*\.wav$ 0:-:.*\.z$ 0:-:.*\.zip$ ## ---------------------------------------------------------------------- ## ---------------------------------------------------------------------- ## Ignore known advertisement sites: ## 0:-:http://.*ad\.de\.doubleclick\.net/.* 0:-:http://.*ad\.linkexchange\.com/.* 0:-:http://.*ad\.uk\.doubleclick\.net/.* 0:-:http://.*adcontent\.gamespy\.com/.* 0:-:http://.*adfu\.slashdot\.org/.* 0:-:http://.*adimages\.go\.com/.* 0:-:http://.*ads\.admaximize\.com//.* 0:-:http://.*ads\.gamespy\.com/.* 0:-:http://.*ads\.web\.aol\.com/.* 0:-:http://.*adserv\.quality-channel\.de/.* 0:-:http://.*webads\.bizservers\.com/.* 0:-:http://.*adforce\.imgis\.com/.* 0:-:http://.*www\.iadventure\.com/.* 0:-:http://.*button\.hitbox\.com/.* 0:-:http://.*ads\.tucows\.com/.* 0:-:http://.*iadventure\.com/.* 0:-:http://www\.pilotmail\.net/.*/ads.* 0:-:http://.*delta-a2\.tucows\.com/.* 0:-:http://.*ad\.doppelklick\.de/.* 0:-:http://.*ad\.doubleclick\.net/.* 0:-:http://.*ad\.adsmart\.net/.* 0:-:http://.*ads\.softbank\.net/.* 0:-:http://.*www\.apacheweek\.com/ads.* 0:-:http://.*www\.pagecount\.com/.* 0:-:http://.*www\.geocities\.com/cgi-bin-local/.* 0:-:http://.*advert\.heise\.de/.* 0:-:http://.*adclient\.whowhere\.com/.* 0:-:http://.*adimage\.whowhere\.com/.* 0:-:http://.*adfu\.blockstackers\.com/.* 0:-:http://.*www\.heise\.de/RealMedia/ads.* 0:-:http://.*adserv\.spiegel\.de/.* 0:-:http://.*images\.zdnet\.com/adverts.* 0:-:http://.*ads\.zdnet\.com/.* 0:-:http://.*ads2\.zdnet\.com/.* 0:-:http://.*ads24\.zdnet\.com/.* 0:-:http://.*ads\.x10\.com/.* 0:-:http://.*ads02\.focalink\.com/.* 0:-:http://.*ads\.devx\.com/.* 0:-:http://.*adforce\.ads\.imgis\.com/.* 0:-:http://.*ads\.linuxsecurity\.com/.* 0:-:http://.*195.198.111.26:8080/click.ng/.* 0:-:http://.*195.198.111.26:8080/image.ng/.* 0:-:http://www\.linuxinsider\.com/images/ads/.* 0:-:http://www\.theregister\.co\.uk/images/adverts/.* ## ---------------------------------------------------------------------- �����������������������������������plucker-1.8/parser/defaults/home.html���������������������������������������������������������������0100644�0000764�0000144�00000002423�07162437410�016771� 0����������������������������������������������������������������������������������������������������ustar �micke���������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!-- $Id: home.html,v 1.4 2000/09/21 17:02:00 nordstrom Exp $ --> <!-- The default home page for Plucker users. You only need to include a MAXDEPTH tag in the anchor if you want more than just the referenced page. --> <HTML> <HEAD> <TITLE>Plucker Home Page

Plucker Home

You can change the contents of this home page just by editing the "home.html" file in the ".plucker" directory in your home directory.

Plucker Information

Plucker home page

Linux links

Linux daily news

Linux Today

Slashdot.org

Weather

Current Toronto Weather

News

New York Times

C-Net NEWS.COM

Wired News

plucker-1.8/parser/Makefile.in0100644000076400001440000000266007713213405015412 0ustar mickeusers# # $Id: Makefile.in,v 1.4 2003/08/03 14:07:01 nordstrom Exp $ # SHELL = @SHELL@ top_builddir = .. subdir = parser srcdir = @srcdir@ VPATH = @srcdir@ DESTDIR = PYTHONDIR = python DEFAULTSDIR = defaults DATADIR = $(DESTDIR)@PLUCKERDIR@ MKINSTALLDIRS = $(top_builddir)/mkinstalldirs all: pyplucker Makefile: Makefile.in $(top_builddir)/config.status cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status pyplucker: cd $(PYTHONDIR) ; $(MAKE) install: install-data install-pyplucker install-data: $(MKINSTALLDIRS) $(DATADIR)/config cp $(DEFAULTSDIR)/home.html $(DATADIR)/config cp $(DEFAULTSDIR)/exclusionlist.txt $(DATADIR)/config cp $(DEFAULTSDIR)/pluckerrc.sample $(DATADIR)/config install-pyplucker: pyplucker cd $(PYTHONDIR) ; $(MAKE) install clean-recursive: cd $(PYTHONDIR) ; $(MAKE) clean distclean-recursive: cd $(PYTHONDIR) ; $(MAKE) distclean maintainer-clean-recursive: cd $(PYTHONDIR) ; $(MAKE) maintainer-clean clean: clean-recursive distclean: clean distclean-recursive rm -f Makefile maintainer-clean: distclean maintainer-clean-recursive @echo "------------------------------------------------------------" @echo "This command is intended for maintainers to use..." @echo "it deletes files that may require special tools to rebuild." @echo "------------------------------------------------------------" plucker-1.8/parser/python/0040755000076400001440000000000010052675407014671 5ustar mickeusersplucker-1.8/parser/python/InvokePluckerBuildFromJava.py0100444000076400001440000000322607562620133022426 0ustar mickeusers# # This file is only used in the Java (Jython) version # It serves as an entry point. # import sys import PyPlucker.Spider from java.lang import Runtime from java.util import Hashtable import org.plkr.distiller.API class InvokePluckerBuildFromJava (org.plkr.distiller.API.Invocation): def __init__(self): "@sig public InvokePluckerBuildFromJava()" pass def create_dict_from_hashtable (self, ht): dict = {} e = ht.keys() while e.hasMoreElements(): key = e.nextElement() value = ht.get(key) dict[str(key)] = str(value) return dict def invoke(self, args, os, inputstring, config, callback): "@sig public int invoke(java.lang.String[] args, java.io.OutputStream os, java.lang.String inputString, java.util.Hashtable config, org.plkr.distiller.API.Callback status)" varargs = ['plucker-build'] if args: for arg in args: varargs.append(str(arg)) if os: outputstream = org.python.core.PyFile(os, "", "wb") else: outputstream = None if config: configdict = self.create_dict_from_hashtable(config) else: configdict = None val = PyPlucker.Spider.realmain(varargs, outputstream, inputstring, configdict, callback) return val if __name__ == '__main__': theRuntime = Runtime.getRuntime() try: val = InvokePluckerBuildFromJava().invoke(sys.argv[1:], None, None, None, None) theRuntime.exit(val) except: import traceback traceback.print_exc(None, sys.stderr) theRuntime.exit(1) plucker-1.8/parser/python/hotsync.cmd0100555000076400001440000000263507127430524017047 0ustar mickeusers/* REXX */ '@ECHO OFF' CALL RxFuncAdd 'SysCls', 'RexxUtil', 'SysCls' CALL rxfuncadd 'sysloadfuncs', 'rexxutil', 'sysloadfuncs' CALL sysloadfuncs 'cls' say "\\ Archiving old /cache..." /* This would be a way to archive your old databases: * Note: Adjust the absolute path! * * 'zip -m F:\PalmPilot\Plucker\DB_'|| Date('S') ||'.zip .\.plucker\cache\*' */ say "// Rebuilding Plucker database..." 'set home=.' /* Remove old files. You don't need this if you use ZIP like above: * Note: For usage with various databases add something like this for * each directory you use. */ rc=Directory("./.plucker/html/*") 'del * /N' rc=Directory("./plucker/html*") 'del * /N' rc=Directory("E:/PalmPilot/Plucker/parser/python") /* Use this to create a specific database only on monday: * * if Date('W')='Monday' then * do * 'zip -m F:\PalmPilot\Plucker\Weekly_'|| Date('S') ||'.zip .\.weekly\cache\*' * * 'python ./PyPlucker/spider.py -c -V1 -p.weekly' * end */ /* Call for usage with 2bit colour: * 'python ./PyPlucker/spider.py -c -V1 -p.shedules --bpp=2' */ /* Normal call for the spider: */ 'python ./PyPlucker/spider.py -c -V1 -p.daily' /* If you want to sync in more than one database use the follwoing * syntax: * * 'perl ../../conduit/sync.pl --name="WeeklyDB PluckerDB" --cache=".weekly * .daily"'; */ /* Call for the conduit: */ 'perl ../../conduit/sync.pl --name="PluckerDB" --cache=".daily"'; plucker-1.8/parser/python/PyPlucker/0040755000076400001440000000000010052675407016607 5ustar mickeusersplucker-1.8/parser/python/PyPlucker/TextParser.py0100555000076400001440000025473310036660154021271 0ustar mickeusers#!/usr/bin/env python # -*- mode: python; indent-tabs-mode: nil; -*- coding: iso-8859-1 -*- """ TextParser.py $Id: TextParser.py,v 1.66 2004/04/13 03:37:16 jimj Exp $ Copyright 1999,2000 by Holger Duerer Distributable under the GNU General Public License Version 2 or newer. """ ## The following section tries to get the PyPlucker directory onto the ## system path if called as a script and if it is not yet there: try: import PyPlucker except ImportError: import os, sys file = sys.argv[0] while os.path.islink (file): file = os.readlink (file) sys.path = [os.path.split (os.path.dirname (file))[0]] + sys.path try: import PyPlucker except ImportError: print "Cannot find where module PyPlucker is located!" sys.exit (1) # and forget the temp names... del file, os del PyPlucker ## ## Now PyPlucker things should generally be importable ## import string import re try: # if the user has the new xml package installed this might be faster # as that package includes one that uses C code to parse from xml.parsers import sgmllib except ImportError: import sgmllib # Fix for the missing comma in raw attributes import re, string # # Originally, plucker overrode this to catch the "@" of # mailto links. This bugfix is already in newer pythons. # If you have a new enough version (the sgmllib distributed # with Python 2.3.3), then we should use the (newer) python # version. This checks whether or not attrfind knows that # @ can appear in unquoted attribute values. If so, use the # python version. # temp=sgmllib.attrfind.match('href=mailto:user@host').groups()[2] if temp is None or '@' not in temp: sgmllib.attrfind = re.compile( r'\s*([a-zA-Z_][-:.a-zA-Z_0-9]*)(\s*=\s*' r'(\'[^\']*\'|"[^"]*"|[-a-zA-Z0-9./,:;+*%?!&$\(\)_#=~\'"@]*))?') import sys import struct import urllib import htmlentitydefs from PyPlucker import PluckerDocs from PyPlucker import Url from PyPlucker import DEFAULT_LOCALE_CHARSET_ENCODING from PyPlucker.helper.CharsetMapping import charset_name_to_mibenum from PyPlucker import UtilFns message = UtilFns.message # the following constant states how big (approximately) one single # paragraphs should maximally be Max_Paragraph_Size = 1000 # how much more to allow in order not to break an anchor Max_Paragraph_Size_Anchor_Stretch = 150 ## The following are used in the parser to clean up things. _RE_WHITESPACE = re.compile ("[\n\f \t]+") _RE_NONSPACEWHITESPACE = re.compile ("[\n\f\t\t]+") _CLEANUP_TRANSTABLE = string.maketrans ("\f", "\n") ## ## There are several colorsets in use on the web. ## ## Plucker has traditionally used the HTML4 color names ## (Colornames_Strict). ## ## CSS2.1 ## adds orange ("FFA500") and several "colors" that depend on ## current system settings. It isn't clear what to do with ## system colors, except maybe defaulting to black. ## ## SVG adds several other colors (from the X windows color ## set, plus some grays). ## ## CSS3 ## color names represent the future of standards, but splits ## color names into several different profiles. Full support ## is more complicated than Plucker currently supports. ## ## Some web sites use Crayola colors. ## Colornames_Strict = { 'black': "000000", 'silver': "C0C0C0", 'gray': "808080", 'white': "FFFFFF", 'maroon': "800000", 'red': "FF0000", 'purple': "800080", 'fuchsia': "FF00FF", 'green': "008000", 'lime': "00FF00", 'olive': "808000", 'yellow': "FFFF00", 'navy': "000080", 'blue': "0000FF", 'teal': "008080", 'aqua': "00FFFF", } Colornames_SVG = { 'aliceblue': 'F0F8FF', 'antiquewhite': 'FAEBD7', 'aqua': '00FFFF', 'aquamarine': '7FFFD4', 'azure': 'F0FFFF', 'beige': 'F5F5DC', 'bisque': 'FFE4C4', 'black': '000000', 'blanchedalmond': 'FFEBCD', 'blue': '0000FF', 'blueviolet': '8A2BE2', 'brown': 'A52A2A', 'burlywood': 'DEB887', 'cadetblue': '5F9EA0', 'chartreuse': '7FFF00', 'chocolate': 'D2691E', 'coral': 'FF7F50', 'cornflowerblue': '6495ED', 'cornsilk': 'FFF8DC', 'crimson': 'DC143C', 'cyan': '00FFFF', 'darkblue': '00008B', 'darkcyan': '008B8B', 'darkgoldenrod': 'B8860B', 'darkgray': 'A9A9A9', 'darkgreen': '006400', 'darkgrey': 'A9A9A9', 'darkkhaki': 'BDB76B', 'darkmagenta': '8B008B', 'darkolivegreen': '556B2F', 'darkorange': 'FF8C00', 'darkorchid': '9932CC', 'darkred': '8B0000', 'darksalmon': 'E9967A', 'darkseagreen': '8FBC8F', 'darkslateblue': '483D8B', 'darkslategray': '2F4F4F', 'darkslategrey': '2F4F4F', 'darkturquoise': '00CED1', 'darkviolet': '9400D3', 'deeppink': 'FF1493', 'deepskyblue': '00BFFF', 'dimgray': '696969', 'dimgrey': '696969', 'dodgerblue': '1E90FF', 'firebrick': 'B22222', 'floralwhite': 'FFFAF0', 'forestgreen': '228B22', 'fuchsia': 'FF00FF', 'gainsboro': 'DCDCDC', 'ghostwhite': 'F8F8FF', 'gold': 'FFD700', 'goldenrod': 'DAA520', 'gray': '808080', 'green': '008000', 'greenyellow': 'ADFF2F', 'grey': '808080', 'honeydew': 'F0FFF0', 'hotpink': 'FF69B4', 'indianred': 'CD5C5C', 'indigo': '4B0082', 'ivory': 'FFFFF0', 'khaki': 'F0E68C', 'lavender': 'E6E6FA', 'lavenderblush': 'FFF0F5', 'lawngreen': '7CFC00', 'lemonchiffon': 'FFFACD', 'lightblue': 'ADD8E6', 'lightcoral': 'F08080', 'lightcyan': 'E0FFFF', 'lightgoldenrodyellow': 'FAFAD2', 'lightgray': 'D3D3D3', 'lightgreen': '90EE90', 'lightgrey': 'D3D3D3', 'lightpink': 'FFB6C1', 'lightsalmon': 'FFA07A', 'lightseagreen': '20B2AA', 'lightskyblue': '87CEFA', 'lightslategray': '778899', 'lightslategrey': '778899', 'lightsteelblue': 'B0C4DE', 'lightyellow': 'FFFFE0', 'lime': '00FF00', 'limegreen': '32CD32', 'linen': 'FAF0E6', 'magenta': 'FF00FF', 'maroon': '800000', 'mediumaquamarine': '66CDAA', 'mediumblue': '0000CD', 'mediumorchid': 'BA55D3', 'mediumpurple': '9370DB', 'mediumseagreen': '3CB371', 'mediumslateblue': '7B68EE', 'mediumspringgreen': '00FA9A', 'mediumturquoise': '48D1CC', 'mediumvioletred': 'C71585', 'midnightblue': '191970', 'mintcream': 'F5FFFA', 'mistyrose': 'FFE4E1', 'moccasin': 'FFE4B5', 'navajowhite': 'FFDEAD', 'navy': '000080', 'oldlace': 'FDF5E6', 'olive': '808000', 'olivedrab': '6B8E23', 'orange': 'FFA500', 'orangered': 'FF4500', 'orchid': 'DA70D6', 'palegoldenrod': 'EEE8AA', 'palegreen': '98FB98', 'paleturquoise': 'AFEEEE', 'palevioletred': 'DB7093', 'papayawhip': 'FFEFD5', 'peachpuff': 'FFDAB9', 'peru': 'CD853F', 'pink': 'FFC0CB', 'plum': 'DDA0DD', 'powderblue': 'B0E0E6', 'purple': '800080', 'red': 'FF0000', 'rosybrown': 'BC8F8F', 'royalblue': '4169E1', 'saddlebrown': '8B4513', 'salmon': 'FA8072', 'sandybrown': 'F4A460', 'seagreen': '2E8B57', 'seashell': 'FFF5EE', 'sienna': 'A0522D', 'silver': 'C0C0C0', 'skyblue': '87CEEB', 'slateblue': '6A5ACD', 'slategray': '708090', 'slategrey': '708090', 'snow': 'FFFAFA', 'springgreen': '00FF7F', 'steelblue': '4682B4', 'tan': 'D2B48C', 'teal': '008080', 'thistle': 'D8BFD8', 'tomato': 'FF6347', 'turquoise': '40E0D0', 'violet': 'EE82EE', 'wheat': 'F5DEB3', 'white': 'FFFFFF', 'whitesmoke': 'F5F5F5', 'yellow': 'FFFF00', 'yellowgreen': '9ACD32', } Colornames = Colornames_SVG def _parse_color (value): """Get the RGB value. Try text colorname (e.g. 'Silver'), then try to lower-case that (e.g., 'silver') then try an RGB value (e.g. #C0C0C0), then try an RGB value missing the # (e.g. C0C0C0) then try RGB (with and without the #) with only one char/color. then default to black ("#000000"). """ try: return Colornames[value] except KeyError: pass # This is redundant, if the page is coded entirely properly. try: return Colornames[value.lower()] except KeyError: pass if value[0] == '#': value = value[1:] try: val = '%06x' % string.atoi(value, 16) return val.upper() except ValueError: pass try: val = '%03x' % string.atoi(value, 16) val = val.upper() val = ((val[0]) * 2) + ((val[1]) * 2) + ((val[2]) * 2) return val except ValueError: pass message (1, "Giving up on color %s, using black.", value) return "000000" def _list_to_dict (alist): """Convert [(attr1,val), (attr2,val) ...] to {attr1:val, attr2:val} The sgml parser returns attributes as a list of key-value pairs. This function puts them in a dictionary, for more easier use.""" assert type(alist) == type([]) result = {} for (key,val) in alist: # string.lower is done by Python's own parser already # but the XML package's version does not. result[string.lower (key)] = cleanup_attribute (val) return result _entitycharref = re.compile('^(.*)&([#a-zA-Z][-.a-zA-Z0-9]*);(.*)$') _html_char_ref_pattern = re.compile('^&#([0-9]+);$') # These junk "alt" attribute values are not worth showing. junk_alt_attributes = ("img", "[img]", "spacer", "") def cleanup_attribute (text): m = _entitycharref.search (text) if not m: return text pre, content, post = m.groups (0) if content[0] == "#": content = content[1:] try: n = int(content) if 0 <= n <= 255: content = chr (n) else: #self._add_unicode_char(val, "&#%d;" % val) # Not in a "self", so can't add the unicode properly. content="&#%d" % val except ValueError: #content = "?" # might as well pass it through. no worse than a "?" content = "&#" + content else: if htmlentitydefs.entitydefs.has_key (content): content = htmlentitydefs.entitydefs[content] else: # content = "?" # usually unescaped & -- AT&T should return AT&T. content = "&" + content return cleanup_attribute (pre) + content + post def _clean_newlines (text): """Try to clean up newlines in source code to be UNIXy. We assume that CP/M derived OSes use \r\n as line terminator and MacOS uses only \r. Both version are converted to use only \n. XXX We should probably use python's universal newlines now.""" text = string.replace (text, "\r\n", "\n") text = string.replace (text, "\r", "\n") return text class AttributeStack: """A data structure to maintain information about the current text attributes. The raw value for the plucker DB is the font to set (as stated by Michael Nordstrom on plucker-dev or found in os.c): | OS2 | --- | 0: stdFont, 1: boldFont, 2: boldFont, 3: boldFont, | 4: boldFont, 5: stdFont, 6: stdFont, 7: stdFont | 8: stdFont 9: stdFont | | OS3 | --- | 0: stdFont, 1: largeBoldFont, 2: largeBoldFont, 3: largeFont, | 4: largeFont, 5: boldFont, 6: boldFont, 7: boldFont | 8: fixedWidthFont 9: stdFont The awk parser sets: : 7 : n (for n= 1, 2, 3, 4, 5, 6) """ def __init__ (self): self._tags = { "" : 0, "b": 7, "th": 7, # we also make table heads configurable "h1": 1, "h2": 2, "h3": 3, "h4": 4, "h5": 5, "h6": 6, "tt" : 8, "pre": 8, "small": 9, "sub" : 10, "sup" : 11, } self._stack = [""] self._alignment = [0] self._left_margin = 0 self._right_margin = 0 self._italics_depth = 0 self._underline_depth = 0 self._strike_depth = 0 self._forecolor = ["000000"] # Default color for text. self._tableborder_forecolor = ["default"] # Default color for table borders def indent (self, change_left=0, change_right=0): self._left_margin = min (60, max (0, self._left_margin + change_left)) self._right_margin = min (120, max (0, self._right_margin + change_right)) return (self._left_margin, self._right_margin) def change_italics (self, increment): """Add 'increment' to the italics counter and return the new value""" self._italics_depth = self._italics_depth + increment return self._italics_depth def change_underline (self, increment): """Add 'increment' to the underline counter and return the new value""" self._underline_depth = self._underline_depth + increment return self._underline_depth def change_strike (self, increment): """Add 'increment' to the strike counter and return the new value""" self._strike_depth = self._strike_depth + increment return self._strike_depth def push_alignment (self, newvalue): """Push a new alignment value. Return true if value has changed""" assert 0 <= newvalue <= 3, \ "Alignment value must be >=0 and <=3 but is %d" % newvalue self._alignment.append (newvalue) return self._alignment[-1] != self._alignment[-2] def pop_alignment (self, value): """Pop some alignment value. Return true if value has changed""" assert value == None or self._alignment[-1] == value, \ "Trying to pop alignment %s but is %s" % (value, self._alignment[-1]) res = self._alignment[-1] != self._alignment[-2] del self._alignment[-1] return res def get_alignment (self): """Return the current alignment.""" assert self._alignment != [], "Alignment stack must not be empty" return self._alignment[-1] def push_forecolor (self, value): """Push a new forecolor value. Return true if value has changed""" self._forecolor.append (value) return self._forecolor[-1] != self._forecolor[-2] def pop_forecolor (self, value): """Pop some forecolor value. Return true if value has changed""" assert self._forecolor[-1] == value, \ "Trying to pop forecolor %s but is %s" % (value, self._forecolor[-1]) foreres = self._forecolor[-1] != self._forecolor[-2] del self._forecolor[-1] return foreres def get_forecolor (self): """Return the current forecolor.""" assert self._forecolor != [], "Forecolor stack must not be empty" return self._forecolor[-1] def push (self, tag): """Push the style for 'tag' onto the stack. Return True if the style was actually changed by this.""" tag = string.lower (tag) assert self._tags.has_key (tag), "Unknown style code %s" % tag self._stack.append (tag) assert len(self._stack) >= 2 return self._tags[self._stack[-1]] != self._tags[self._stack[-2]] def pop (self, tag): """Pop a style from the stack and verify that it is 'tag'. Return true if the style now changed (i.e. new top of stack is different from the popped item).""" tag = string.lower (tag) assert self._tags.has_key (tag), "Unknown style code %s" % tag assert len(self._stack) >= 2, "Trying to pop from empty stack" res = self._tags[self._stack[-1]] != self._tags[self._stack[-2]] top = self._stack[-1] assert top == tag, "Expected TOS not found" self._stack = self._stack[:-1] assert self._stack != [], "Stack must not be empty" return res def get_style (self): """Return the numeric style code as used by Plucker for the current state.""" assert self._stack != [], "Stack must not be empty" return self._tags[self._stack[-1]] class TextDocBuilder: """Encapsulate the knowledge of when to change styles, add paragraphs, etc.""" def __init__ (self, url, config, **keyword_args): self._doc = PluckerDocs.PluckerTextDocument (url) self._config = config self._attributes = AttributeStack () self._paragraph = PluckerDocs.PluckerTextParagraph () self._is_new_paragraph = 1 self._is_new_line = 1 self._approximate_size = 0 self._anchor_dict = None self._max_para_size = ((keyword_args.has_key("max_paragraph_size") and keyword_args["max_paragraph_size"] > 0 and keyword_args["max_paragraph_size"]) or Max_Paragraph_Size) self._max_para_size_stretch = ((keyword_args.has_key("max_paragraph_size_anchor_stretch") and keyword_args["max_paragraph_size_anchor_stretch"] > 0 and keyword_args["max_paragraph_size_anchor_stretch"]) or Max_Paragraph_Size_Anchor_Stretch) # If document has no tag, then will draw in device's default text color # (which may not be black if they have hacked it with Kroma or similar utility) until # first color change, or new paragraph, then will go to black. This makes sure document # starts off in black. self._color_paragraphs = config.get_bool("color_paragraphs") if (self._color_paragraphs): self._paragraph.add_set_forecolor (self._attributes.get_forecolor ()) def _within_anchor (self): return not (self._anchor_dict is None) def set_charset(self, charset): self._doc.set_charset(charset_name_to_mibenum(charset)) def set_id_tag(self, tag): self._doc.register_doc(tag) def get_doc (self): """Finish up and get the PluckerTextDocument that we built""" self.close () return self._doc def close (self): """Finish off""" if not self._is_new_paragraph: self._doc.add_paragraph (self._paragraph) self._paragraph = PluckerDocs.PluckerTextParagraph () self._is_new_paragraph = 1 if not self._doc.get_charset(): # see if we can supply a default charset url = self._doc.get_url() if self._config: userspec = self._config.get_int('default_charset', 0) else: userspec = None locale_default = charset_name_to_mibenum(DEFAULT_LOCALE_CHARSET_ENCODING) # the userspec will take precedence if userspec: self._doc.set_charset(userspec) # OK, so we have no idea. Use the HTTP default of ISO-8859-1 (4) for # http: URLs, and the environment default (if any) for others elif (string.lower(url[:5]) == 'http:' or string.lower(url[:6]) == 'https:'): self._doc.set_charset(4) elif locale_default: self._doc.set_charset(locale_default) def add_name (self, name): """Give name to the current paragraph""" self._paragraph.add_name (name) def indent (self, change_left, change_right): (l, r) = self._attributes.indent (change_left, change_right) self._paragraph.add_set_margin (l, r) def start_italics (self): """Change to italics if not already so""" newval = self._attributes.change_italics (1) if newval > 1: # was already italics on, so nothing needs be done pass else: self._paragraph.add_italics_start () def end_italics (self): """Change to italics off if this is the last end_italics to come""" newval = self._attributes.change_italics (-1) if newval >= 1: # italics is still on (cascaded calls) pass else: self._paragraph.add_italics_end () def start_underline (self): """Change to underlining text if not already so""" newval = self._attributes.change_underline (1) if newval > 1: # was already in underline mode, so nothing needs be done pass else: self._paragraph.add_underline_start () def end_underline (self): """Change to underline off if this is the last end_underline to come""" newval = self._attributes.change_underline (-1) if newval >= 1: # underline is still on (cascaded calls) pass else: self._paragraph.add_underline_end () def start_strike (self): """Change to strikethrough if not already so""" newval = self._attributes.change_strike (1) if newval > 1: # was already strikethrough on, so nothing needs be done pass else: self._paragraph.add_strike_start () def end_strike (self): """Change to strikethrough off if this is the last end_strike to come""" newval = self._attributes.change_strike (-1) if newval >= 1: # strikethrough is still on (cascaded calls) pass else: self._paragraph.add_strike_end () def set_style (self, style): """Set current style to 'tag', where tag is "b", "h1", "h2", ...""" if self._attributes.push (style): # style has changed self._add_style_change () def unset_style (self, style): """Un-set a style change by a previous 'set_style'. Make sure it previously set 'style'.""" if self._attributes.pop (style): # style has changed self._add_style_change () def _add_style_change (self): """Add info about a new style to take effect.""" self._paragraph.add_style_change (self._attributes.get_style ()) def get_alignment (self): """Get current alignment (values 0, 1, or 2)""" return self._attributes.get_alignment () def set_alignment (self, value): """Set current alignment to 'value', where value = 0, 1, 2""" if self._attributes.push_alignment (value): # alignment has changed self._add_alignment_change () def unset_alignment (self, value): """Un-set an alignment change by a previous 'set_alignment'. Make sure it previously set 'value' (unless 'value' is None).""" if self._attributes.pop_alignment (value): # style has changed self._add_alignment_change () def get_forecolor (self): """Get current forecolor value. value should be an rgb""" return self._attributes.get_forecolor () def set_forecolor (self, value): """Set current forecolor to 'value' """ rgb = _parse_color (value) if not rgb: return # Don't want any white text on PDA's white form since would be invisible, # so if white, just darken it a bit to silver. if string.atoi(rgb, 16) == 0xFFFFFF: rgb = "C0C0C0" if self._attributes.push_forecolor (rgb): # forecolor has changed self._add_forecolor_change () def unset_forecolor (self, value): """Un-set an alignment change by a previous 'set_forecolor'. Make sure it previously set 'value' (unless 'value' is None).""" if self._attributes.pop_forecolor (value): # forecolor has changed self._add_forecolor_change () def _add_alignment_change (self): """Add info about a new alignment to take effect.""" self._paragraph.add_set_alignment (self._attributes.get_alignment ()) def _add_forecolor_change (self): """Add info about a new forecolor to take effect.""" self._paragraph.add_set_forecolor (self._attributes.get_forecolor ()) def _ship_paragraph (self): """Finish the current paragraph and start a fresh one""" # finish off the old paragraph the_anchor_dict = None if self._within_anchor (): the_anchor_dict = {} the_anchor_dict.update (self._anchor_dict) self.add_document_link_end () if self._attributes.change_italics (0): self._paragraph.add_italics_end () if self._attributes.change_underline (0): self._paragraph.add_underline_end () if self._attributes.change_strike (0): self._paragraph.add_strike_end () # now start new paragraph self._doc.add_paragraph (self._paragraph) self._paragraph = PluckerDocs.PluckerTextParagraph () self._is_new_paragraph = 1 self._is_new_line = 1 self._approximate_size = 0 if self._attributes.get_style (): # we are in non-default style self._add_style_change () if self._attributes.get_alignment (): # we are in non-default alignment self._add_alignment_change () if self._attributes.get_forecolor () or self._color_paragraphs: # we are in non-default forecolor self._paragraph.add_set_forecolor (self._attributes.get_forecolor ()) (l, r) = self._attributes.indent () message(4, "-- New paragraph: margins %d, %d", l, r) if l != 0 or r != 0: self._paragraph.add_set_margin (l, r) if self._attributes.change_italics (0): self._paragraph.add_italics_start () if self._attributes.change_underline (0): self._paragraph.add_underline_start () if self._attributes.change_strike (0): self._paragraph.add_strike_start () # re-start the link if there was one if the_anchor_dict is not None: self.add_document_link_start (the_anchor_dict) def add_vspace (self, n_units=2, additional=0): """Make the representation to have a new line. Add a new paragraph, unless this one is already new and has no extra spacing""" n_units = min (n_units, 7) if n_units==0 and not self._is_new_paragraph: if not self._is_new_line: # special case: use code self._paragraph.add_newline () self._is_new_line = 1 return if not additional: # is already newline and we don't want additional vspace return else: # we are on a new line, so we need to add 4 units to get an additional new line n_units = 4 if self._is_new_paragraph: if n_units == 0 and additional: n_units = 4 old_spacing = self._paragraph.get_extra_spacing () if not additional and (old_spacing >= n_units): # already enough space return if additional: new_spacing = old_spacing + n_units else: new_spacing = max (old_spacing, n_units) if new_spacing <= 7: self._paragraph.set_extra_spacing (new_spacing) else: while new_spacing > 7: self._paragraph.set_extra_spacing (7) new_spacing = new_spacing - 7 self.add_text (" ") self._ship_paragraph () self._paragraph.set_extra_spacing (new_spacing) else: self._ship_paragraph () self._paragraph.set_extra_spacing (n_units) def _find_text_split (self, line, size): """Split line so that the first part is approx. size bytes long. Return (first_part, rest).""" # XXX Why do we care? Could we use TextWrapper? first = line[:size] rest = line[size:] # We try to split at a space: if " " in rest: f = string.split(rest, None, 1) if len (f) > 0: # Shouldn't this always be the case? Mike reports that it can happen... first = first + f[0] if len (f) > 1: rest = f[1] else: rest = "" else: # Strange... how does this happen? first = first + rest rest = "" else: # No decent split found: just don't split it... first = first + rest rest = "" return (first, rest) def add_text (self, text): """Add some text, maybe even many lines.""" lines = string.split (text, "\n") for i in range (len (lines)): line = lines[i] while 1: new_size = self._approximate_size + len (line) if self._within_anchor (): max_size = self._max_para_size+self._max_para_size_stretch else: max_size = self._max_para_size if new_size < max_size: break rest_size = self._max_para_size - self._approximate_size if rest_size < 0: rest_size = 0 (first, rest) = self._find_text_split (line, rest_size) self._paragraph.add_text (first) self._approximate_size = self._approximate_size + len (first) self._is_new_paragraph = 0 self._is_new_line = 0 line = rest self._ship_paragraph () if not line: break if line: self._paragraph.add_text (line) self._approximate_size = self._approximate_size + len (line) self._is_new_paragraph = 0 self._is_new_line = 0 if i != len (lines)-1: # add the newline that was left out self.add_vspace (n_units=0, additional=1) def add_unicode_char (self, char_code, text_alternative): """Add a Unicode character, along with a non-Unicode text alternative.""" self._paragraph.add_unicode_char (char_code, text_alternative) self._is_new_line = 0 self._is_new_paragraph = 0 self._approximate_size = self._approximate_size + 7 + len(text_alternative) def add_image (self, attributes): """Add an image reference""" self._is_new_paragraph = 0 self._is_new_line = 0 self._paragraph.add_image_reference (attributes) # print 'image attributes are ' + str(attributes) def add_table (self, dict_of_items): """Add a table""" self._is_new_paragraph = 0 self._is_new_line = 0 self._paragraph.add_table (dict_of_items) def add_document_link_start (self, dict_of_items): """Add an achor start""" if not self._within_anchor (): self._is_new_paragraph = 0 self._is_new_line = 0 self._paragraph.add_anchor_start (dict_of_items) self._anchor_dict = dict_of_items def add_document_link_end (self): """Add an achor end""" if self._within_anchor (): self._is_new_paragraph = 0 self._is_new_line = 0 self._paragraph.add_anchor_end () self._anchor_dict = None def add_hr (self, height=0, width=0, perc_width=0): """Add a hr""" self._is_new_paragraph = 0 self._is_new_line = 0 self._paragraph.add_hr (height, width, perc_width) class PlainTextParser: """Parsing a simple Text""" def __init__ (self, url, text, headers, config, attribs): text = _clean_newlines (text) # This we use to build the document self._doc = TextDocBuilder (url, config) if headers.has_key("charset"): self._doc.set_charset (headers["charset"]) elif attribs.has_key("charset"): self._doc.set_charset (attribs["charset"]) self._url = url self._text = text # In these two lists we store tuples of (url, attributes) for encountered anchors # and image references. Currently we don't even search for these... self._anchors = [] self._images = [] self._doc.add_text (text) self._doc.close () def get_plucker_doc (self): """Get the PluckerTextDocument. Useful after a close()""" return self._doc.get_doc () def get_anchors (self): """Return the list of found anchors""" return self._anchors def get_images (self): """Return the list of found images""" return self._images def has_unknown (self): """Check if during parsing we found unknown things""" return 0 def print_unknown (self, prefix): """Print a summary of the unknown things found during parsing""" pass def get_unknown (self): """Get a list unknown things found during parsing.""" return {} # the following lists are derived from the HTML 4.01 spec. Don't change them! # Actually, LI is not in the spec, but the spec defines it to act very much # as a block-level element, so we put it in our list for the moment. HTML_BLOCK_ELEMENTS = ('head', 'body', 'li', 'dl', 'div', 'center', 'dir', 'menu', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'noframes', 'isindex', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre') HTML_OPTIONAL_END_ELEMENTS = ('body', 'colgroup', 'dd', 'dt', 'head', 'html', 'li', 'option', 'p', 'tbody', 'tfoot', 'thead') HTML_TABLE_ELEMENTS = ('td', 'th', 'tr') HTML_FORBIDDEN_END_ELEMENTS = ('area', 'base', 'basefont', 'br', 'col', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param') HTML_NO_ID_ELEMENTS = ('base', 'head', 'html', 'meta', 'script', 'style', 'title') class StructuredHTMLParser (sgmllib.SGMLParser): """Parsing correct HTML, and digesting it into a PluckerTextDocument.""" def __init__ (self, url, text, headers = {}, config = None, attribs = {}): sgmllib.SGMLParser.__init__ (self) # Convert all to for XHTML compatability text = string.replace (text, "/>", " />") text = _clean_newlines (text) # This we use to build the document self._doc = TextDocBuilder (url, config, max_paragraph_size=3000) self._url = url self._base = None # use this if defined for relative URLs self._config = config self._attribs = attribs # initialize verbosity... self._verbosity_stack = [] # We use different indicator for diffent depths of

,