From 00b5b5628081bcb18902aed971a6a094c810a766 Mon Sep 17 00:00:00 2001 From: znek Date: Wed, 8 Dec 2004 22:36:03 +0000 Subject: [PATCH] added a SAX driver for generating SAX events from ChangeLog files. Enjoy. git-svn-id: http://svn.opengroupware.org/SOPE/trunk@429 e4a50df8-12e2-0310-a44c-efbce7f8a7e3 --- sope-xml/ChangeLogSaxDriver/AUTHORS | 1 + sope-xml/ChangeLogSaxDriver/COPYING | 437 +++++++++++++++ sope-xml/ChangeLogSaxDriver/COPYRIGHT | 3 + sope-xml/ChangeLogSaxDriver/ChangeLog | 3 + .../ChangeLogSaxDriver/ChangeLogSaxDriver.h | 49 ++ .../ChangeLogSaxDriver/ChangeLogSaxDriver.m | 428 ++++++++++++++ .../ChangeLogSaxDriver.xcode/project.pbxproj | 526 ++++++++++++++++++ sope-xml/ChangeLogSaxDriver/GNUmakefile | 23 + .../ChangeLogSaxDriver/GNUmakefile.postamble | 5 + .../ChangeLogSaxDriver/GNUmakefile.preamble | 17 + sope-xml/ChangeLogSaxDriver/Info.plist | 24 + .../NSCalendarDate+Extensions.h | 37 ++ .../NSCalendarDate+Extensions.m | 44 ++ .../ChangeLogSaxDriver/NSString+Extensions.h | 34 ++ .../ChangeLogSaxDriver/NSString+Extensions.m | 187 +++++++ sope-xml/ChangeLogSaxDriver/README | 70 +++ sope-xml/ChangeLogSaxDriver/Version | 3 + sope-xml/ChangeLogSaxDriver/bundle-info.plist | 23 + sope-xml/ChangeLogSaxDriver/common.h | 30 + sope-xml/ChangeLogSaxDriver/default.locale | 10 + sope-xml/ChangeLogSaxDriver/fhs.make | 25 + sope-xml/ChangeLogSaxDriver/version.plist | 16 + .../SaxObjC/SaxObjC.xcode/project.pbxproj | 2 +- 23 files changed, 1996 insertions(+), 1 deletion(-) create mode 100644 sope-xml/ChangeLogSaxDriver/AUTHORS create mode 100644 sope-xml/ChangeLogSaxDriver/COPYING create mode 100644 sope-xml/ChangeLogSaxDriver/COPYRIGHT create mode 100644 sope-xml/ChangeLogSaxDriver/ChangeLog create mode 100644 sope-xml/ChangeLogSaxDriver/ChangeLogSaxDriver.h create mode 100644 sope-xml/ChangeLogSaxDriver/ChangeLogSaxDriver.m create mode 100644 sope-xml/ChangeLogSaxDriver/ChangeLogSaxDriver.xcode/project.pbxproj create mode 100644 sope-xml/ChangeLogSaxDriver/GNUmakefile create mode 100644 sope-xml/ChangeLogSaxDriver/GNUmakefile.postamble create mode 100644 sope-xml/ChangeLogSaxDriver/GNUmakefile.preamble create mode 100644 sope-xml/ChangeLogSaxDriver/Info.plist create mode 100644 sope-xml/ChangeLogSaxDriver/NSCalendarDate+Extensions.h create mode 100644 sope-xml/ChangeLogSaxDriver/NSCalendarDate+Extensions.m create mode 100644 sope-xml/ChangeLogSaxDriver/NSString+Extensions.h create mode 100644 sope-xml/ChangeLogSaxDriver/NSString+Extensions.m create mode 100644 sope-xml/ChangeLogSaxDriver/README create mode 100644 sope-xml/ChangeLogSaxDriver/Version create mode 100644 sope-xml/ChangeLogSaxDriver/bundle-info.plist create mode 100644 sope-xml/ChangeLogSaxDriver/common.h create mode 100644 sope-xml/ChangeLogSaxDriver/default.locale create mode 100644 sope-xml/ChangeLogSaxDriver/fhs.make create mode 100644 sope-xml/ChangeLogSaxDriver/version.plist diff --git a/sope-xml/ChangeLogSaxDriver/AUTHORS b/sope-xml/ChangeLogSaxDriver/AUTHORS new file mode 100644 index 00000000..c96af392 --- /dev/null +++ b/sope-xml/ChangeLogSaxDriver/AUTHORS @@ -0,0 +1 @@ +Marcus Mueller diff --git a/sope-xml/ChangeLogSaxDriver/COPYING b/sope-xml/ChangeLogSaxDriver/COPYING new file mode 100644 index 00000000..1adca665 --- /dev/null +++ b/sope-xml/ChangeLogSaxDriver/COPYING @@ -0,0 +1,437 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, 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 library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, 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 companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, 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 library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete 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 distribute a copy of this License along with the +Library. + + 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 Library or any portion +of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +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 Library, 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 Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you 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. + + If distribution of 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 satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. 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. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library 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. + + 9. 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 Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +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. + + 11. 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 Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library 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 Library. + +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. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library 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. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library 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 Library +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 Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +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 + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. 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 LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/sope-xml/ChangeLogSaxDriver/COPYRIGHT b/sope-xml/ChangeLogSaxDriver/COPYRIGHT new file mode 100644 index 00000000..b6b68875 --- /dev/null +++ b/sope-xml/ChangeLogSaxDriver/COPYRIGHT @@ -0,0 +1,3 @@ +Copyright (C) 2004 Marcus Mueller + +Contact: znek@mulle-kybernetik.com diff --git a/sope-xml/ChangeLogSaxDriver/ChangeLog b/sope-xml/ChangeLogSaxDriver/ChangeLog new file mode 100644 index 00000000..fe26df1f --- /dev/null +++ b/sope-xml/ChangeLogSaxDriver/ChangeLog @@ -0,0 +1,3 @@ +2004-12-07 Marcus Mueller + + * ChangeLog: created (v4.5.0) diff --git a/sope-xml/ChangeLogSaxDriver/ChangeLogSaxDriver.h b/sope-xml/ChangeLogSaxDriver/ChangeLogSaxDriver.h new file mode 100644 index 00000000..301218f4 --- /dev/null +++ b/sope-xml/ChangeLogSaxDriver/ChangeLogSaxDriver.h @@ -0,0 +1,49 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OpenGroupware.org. + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo 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 Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ + +#ifndef __ChangeLogSaxDriver_ChangeLogSaxDriver_H_ +#define __ChangeLogSaxDriver_ChangeLogSaxDriver_H_ + +#import +#include + +@interface ChangeLogSaxDriver : NSObject < SaxXMLReader > +{ + @private + id contentHandler; + id errorHandler; + + /* features */ + BOOL fNamespaces; + BOOL fNamespacePrefixes; + NSString *namespace; + + /* internal */ + NSMutableString *currentLog; + struct { + unsigned hasLog : 1; + unsigned hasEntry : 1; + } flags; +} + +@end + +#endif /* __ChangeLogSaxDriver_ChangeLogSaxDriver_H_ */ diff --git a/sope-xml/ChangeLogSaxDriver/ChangeLogSaxDriver.m b/sope-xml/ChangeLogSaxDriver/ChangeLogSaxDriver.m new file mode 100644 index 00000000..dc271a4a --- /dev/null +++ b/sope-xml/ChangeLogSaxDriver/ChangeLogSaxDriver.m @@ -0,0 +1,428 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OpenGroupware.org. + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo 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 Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ + +#include "ChangeLogSaxDriver.h" +#include "NSString+Extensions.h" +#include "NSCalendarDate+Extensions.h" +#include "common.h" + +@interface ChangeLogSaxDriver(PrivateAPI) +- (NSString *)_namespace; +- (void)_writeString:(id)_s; +- (void)_processLine:(NSString *)_line; +- (void)_parseFromString:(NSString *)_str systemId:(NSString *)_sysId; + +- (void)_beginEntryWithDate:(NSCalendarDate *)_date; +- (void)_endEntry; +- (void)_beginLogs; +- (void)_endLogs; +- (void)_beginLog; +- (void)_appendLog:(NSString *)_s; +- (void)_endLog; +@end + +@implementation ChangeLogSaxDriver + +static NSCharacterSet *wsSet = nil; +static NSCharacterSet *wsnlSet = nil; + ++ (void)initialize { + static BOOL didInit = NO; + + if(didInit) return; + didInit = YES; + wsSet = [[NSCharacterSet whitespaceCharacterSet] retain]; + wsnlSet = [[NSCharacterSet whitespaceAndNewlineCharacterSet] retain]; +} + +- (void)dealloc { + [self->contentHandler release]; + [self->errorHandler release]; + [self->namespace release]; + [super dealloc]; +} + +/* properties */ + +- (void)setProperty:(NSString *)_name to:(id)_value { + return; + [SaxNotRecognizedException raise:@"PropertyException" + format:@"don't know property %@", _name]; +} +- (id)property:(NSString *)_name { + return nil; + [SaxNotRecognizedException raise:@"PropertyException" + format:@"don't know property %@", _name]; + return nil; +} + + +/* features */ + +- (void)setFeature:(NSString *)_name to:(BOOL)_value { + if ([_name isEqualToString:@"http://xml.org/sax/features/namespaces"]) { + self->fNamespaces = _value; + return; + } + + if ([_name isEqualToString: + @"http://xml.org/sax/features/namespace-prefixes"]) { + self->fNamespacePrefixes = _value; + return; + } + + [SaxNotRecognizedException raise:@"FeatureException" + format:@"don't know feature %@", _name]; +} +- (BOOL)feature:(NSString *)_name { + if ([_name isEqualToString:@"http://xml.org/sax/features/namespaces"]) + return self->fNamespaces; + + if ([_name isEqualToString: + @"http://xml.org/sax/features/namespace-prefixes"]) + return self->fNamespacePrefixes; + + if ([_name isEqualToString: + @"http://www.skyrix.com/sax/features/predefined-namespaces"]) + return NO; + + [SaxNotRecognizedException raise:@"FeatureException" + format:@"don't know feature %@", _name]; + return NO; +} + + +/* handlers */ + +/* + - (void)setDocumentHandler:(id)_handler { + SaxDocumentHandlerAdaptor *a; + + a = [[SaxDocumentHandlerAdaptor alloc] initWithDocumentHandler:_handler]; + [self setContentHandler:a]; + [a release]; + } + */ + +- (void)setDTDHandler:(id)_handler { +} +- (id)dtdHandler { + return nil; +} + +- (void)setErrorHandler:(id)_handler { + ASSIGN(self->errorHandler, _handler); +} +- (id)errorHandler { + return self->errorHandler; +} + +- (void)setEntityResolver:(id)_handler { +} +- (id)entityResolver { + return nil; +} + +- (void)setContentHandler:(id)_handler { + ASSIGN(self->contentHandler, _handler); +} +- (id)contentHandler { + return self->contentHandler; +} + + +/* parsing ... */ + +- (void)parseFromSource:(id)_source systemId:(NSString *)_sysId { + NSAutoreleasePool *pool; + + pool = [[NSAutoreleasePool alloc] init]; + + if ([_source isKindOfClass:[NSData class]]) { + NSString *s; + + s = [[NSString alloc] initWithData:_source + encoding:[NSString defaultCStringEncoding]]; + [self _parseFromString:s systemId:_sysId]; + [s release]; + } + else if ([_source isKindOfClass:[NSURL class]]) { + [self parseFromSystemId:_source]; + } + else if ([_source isKindOfClass:[NSString class]]) { + if (_sysId == nil) _sysId = @""; + [self _parseFromString:_source systemId:_sysId]; + } + else { + SaxParseException *e; + NSDictionary *ui; + + ui = [NSDictionary dictionaryWithObjectsAndKeys: + _source ? _source : @"", @"source", + self, @"parser", + nil]; + + e = (id)[SaxParseException exceptionWithName:@"SaxIOException" + reason:@"can't handle data-source" + userInfo:ui]; + + [self->errorHandler fatalError:e]; + } + + [pool release]; +} +- (void)parseFromSource:(id)_source { + [self parseFromSource:_source systemId:@""]; +} + +- (void)parseFromSystemId:(NSString *)_sysId { + NSAutoreleasePool *pool; + NSString *str; + NSURL *url; + + pool = [[NSAutoreleasePool alloc] init]; + + url = [NSURL URLWithString:_sysId]; + str = [NSString stringWithContentsOfURL:url]; + + [self _parseFromString:str systemId:_sysId]; + + [pool release]; +} + + +/* Private API */ + +- (void)_parseFromString:(NSString *)_s systemId:(NSString *)_sysId { + static SaxAttributes *versionAttr = nil; + NSArray *lines; + unsigned i, count; + + self->currentLog = [[NSMutableString alloc] initWithCapacity:200]; + self->flags.hasLog = NO; + self->flags.hasEntry = NO; + + if (versionAttr == nil) { + versionAttr = [[SaxAttributes alloc] init]; + [versionAttr addAttribute:@"version" + uri:[self _namespace] + rawName:@"version" + type:@"CDATA" + value:@"1.0"]; + } + + lines = [_s componentsSeparatedByString:@"\n"]; + count = [lines count]; + + [self->contentHandler startDocument]; + [self->contentHandler startElement:@"changelog" + namespace:[self _namespace] + rawName:@"changelog" + attributes:versionAttr]; + + for(i = 0; i < count; i++) { + [self _processLine:[lines objectAtIndex:i]]; + } + [self _endEntry]; + [self->contentHandler endElement:@"changelog" + namespace:[self _namespace] + rawName:@"changelog"]; + + [self->contentHandler endDocument]; + [self->currentLog release]; +} + +- (void)_processLine:(NSString *)_line { + if([_line length] > 0) { + unichar first; + NSCalendarDate *date; + NSString *author; + + first = [_line characterAtIndex:0]; + if(!(first == '*' || + first == '-' || + [wsSet characterIsMember:first]) && + [_line parseDate:&date andAuthor:&author]) + { + SaxAttributes *authorAttrs; + NSString *realName, *email; + + /* entry start */ + [self _beginEntryWithDate:date]; + /* author */ + [author getRealName:&realName andEmail:&email]; + if(!email) + email = @""; + authorAttrs = [[SaxAttributes alloc] init]; + [authorAttrs addAttribute:@"email" + uri:[self _namespace] + rawName:@"email" + type:@"CDATA" + value:email]; + [self->contentHandler startElement:@"author" + namespace:[self _namespace] + rawName:@"author" + attributes:authorAttrs]; + [authorAttrs release]; + [self _writeString:realName]; + [self->contentHandler endElement:@"author" + namespace:[self _namespace] + rawName:@"author"]; + } + else { + /* strip leading whitespace and "*" from line */ + _line = [_line stringByTrimmingLeadSpaces]; + if([_line length] > 0) { + first = [_line characterAtIndex:0]; + + if(first == '*') { + /* new log line */ + [self _beginLog]; + _line = [_line substringFromIndex:1]; + _line = [_line stringByTrimmingLeadSpaces]; + } + [self _appendLog:_line]; + } + } + } +} + +- (void)_beginEntryWithDate:(NSCalendarDate *)_date { + SaxAttributes *entryAttrs; + + [self _endEntry]; + + /* date */ + entryAttrs = [[SaxAttributes alloc] init]; + [entryAttrs addAttribute:@"date" + uri:[self _namespace] + rawName:@"date" + type:@"CDATA" + value:[_date w3OrgDateTimeRepresentation]]; + [self->contentHandler startElement:@"entry" + namespace:[self _namespace] + rawName:@"entry" + attributes:entryAttrs]; + [entryAttrs release]; + self->flags.hasEntry = YES; +} + +- (void)_endEntry { + if(self->flags.hasEntry) { + [self _endLogs]; + [self->contentHandler endElement:@"entry" + namespace:[self _namespace] + rawName:@"entry"]; + self->flags.hasEntry = NO; + } +} + +- (void)_beginLogs { + if(!self->flags.hasLog) { + [self->contentHandler startElement:@"logs" + namespace:[self _namespace] + rawName:@"logs" + attributes:nil]; + self->flags.hasLog = YES; + } +} + +- (void)_endLogs { + if(self->flags.hasLog) { + [self _endLog]; + [self->contentHandler endElement:@"logs" + namespace:[self _namespace] + rawName:@"logs"]; + self->flags.hasLog = NO; + } +} + + +- (void)_beginLog { + [self _beginLogs]; + [self _endLog]; +} + +- (void)_appendLog:(NSString *)_s { + unsigned loc; + + if([_s length] == 0) + return; + loc = [self->currentLog length]; + if(loc > 0) { + unichar last; + + last = [self->currentLog characterAtIndex:loc - 1]; + if(![wsnlSet characterIsMember:last]) { + [self->currentLog appendString:@" "]; + } + } + [self->currentLog appendString:_s]; +} + +- (void)_endLog { + NSRange r; + + r = NSMakeRange(0, [self->currentLog length]); + if(r.length == 0) + return; + + [self _beginLogs]; + [self->contentHandler startElement:@"log" + namespace:[self _namespace] + rawName:@"log" + attributes:nil]; + [self _writeString:self->currentLog]; + [self->contentHandler endElement:@"log" + namespace:[self _namespace] + rawName:@"log"]; + [self->currentLog deleteCharactersInRange:r]; +} + +- (NSString *)_namespace { + if(!self->namespace) + return @""; + return self->namespace; +} + +- (void)_writeString:(NSString *)_s { + unsigned len; + + if ((len = [_s length]) == 0) return; + + if (len == 1) { + unichar c[2]; + [_s getCharacters:&(c[0])]; + c[1] = '\0'; + [self->contentHandler characters:&(c[0]) length:1]; + } + else { + unichar *ca; + + ca = calloc(len + 1, sizeof(unichar)); + [_s getCharacters:ca]; + ca[len] = 0; + [self->contentHandler characters:ca length:len]; + if (ca) free(ca); + } +} + +@end /* ChangeLogSaxDriver */ diff --git a/sope-xml/ChangeLogSaxDriver/ChangeLogSaxDriver.xcode/project.pbxproj b/sope-xml/ChangeLogSaxDriver/ChangeLogSaxDriver.xcode/project.pbxproj new file mode 100644 index 00000000..839d38a8 --- /dev/null +++ b/sope-xml/ChangeLogSaxDriver/ChangeLogSaxDriver.xcode/project.pbxproj @@ -0,0 +1,526 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 39; + objects = { + 014CEA420018CDE011CA2923 = { + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + ZERO_LINK = YES; + }; + isa = PBXBuildStyle; + name = Development; + }; + 014CEA430018CDE011CA2923 = { + buildSettings = { + COPY_PHASE_STRIP = YES; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + ZERO_LINK = NO; + }; + isa = PBXBuildStyle; + name = Deployment; + }; +//010 +//011 +//012 +//013 +//014 +//080 +//081 +//082 +//083 +//084 + 089C1669FE841209C02AAC07 = { + buildSettings = { + }; + buildStyles = ( + 014CEA420018CDE011CA2923, + 014CEA430018CDE011CA2923, + ); + hasScannedForEncodings = 1; + isa = PBXProject; + mainGroup = 089C166AFE841209C02AAC07; + projectDirPath = ""; + targets = ( + 8D5B49AC048680CD000E48DA, + ); + }; + 089C166AFE841209C02AAC07 = { + children = ( + ADB07DB10766619F003C5ACF, + ADB07DB3076661A8003C5ACF, + ADB07DB5076661B2003C5ACF, + ADB07DB7076661BB003C5ACF, + ADB07DB9076661CF003C5ACF, + ADB07DBB076661DB003C5ACF, + ADB079040765EAA0003C5ACF, + ADB078C50765E8B7003C5ACF, + 08FB77AFFE84173DC02AAC07, + 089C167CFE841241C02AAC07, + 089C1671FE841209C02AAC07, + 19C28FB8FE9D52D311CA2CBB, + ); + isa = PBXGroup; + name = ChangeLogSaxDriver; + refType = 4; + sourceTree = ""; + }; + 089C1671FE841209C02AAC07 = { + children = ( + ADB0790B0765EBD1003C5ACF, + ADB079090765EBA0003C5ACF, + ADB07A7F0766076A003C5ACF, + ); + isa = PBXGroup; + name = Frameworks; + refType = 4; + sourceTree = ""; + }; + 089C167CFE841241C02AAC07 = { + children = ( + 8D5B49B7048680CD000E48DA, + ADB078C60765E90E003C5ACF, + ADB07E5007666A25003C5ACF, + ); + isa = PBXGroup; + name = Resources; + refType = 4; + sourceTree = ""; + }; + 08FB77AFFE84173DC02AAC07 = { + children = ( + ADB079110765EDB6003C5ACF, + ADB078C90765E936003C5ACF, + ADB07B450766145E003C5ACF, + ADB07B410766144A003C5ACF, + ); + fileEncoding = 5; + indentWidth = 2; + isa = PBXGroup; + name = Classes; + refType = 4; + sourceTree = ""; + }; +//080 +//081 +//082 +//083 +//084 +//190 +//191 +//192 +//193 +//194 + 19C28FB8FE9D52D311CA2CBB = { + children = ( + 8D5B49B6048680CD000E48DA, + ); + isa = PBXGroup; + name = Products; + refType = 4; + sourceTree = ""; + }; +//190 +//191 +//192 +//193 +//194 +//8D0 +//8D1 +//8D2 +//8D3 +//8D4 + 8D5B49AC048680CD000E48DA = { + buildPhases = ( + 8D5B49AF048680CD000E48DA, + 8D5B49B1048680CD000E48DA, + 8D5B49B3048680CD000E48DA, + ); + buildRules = ( + ); + buildSettings = { + FRAMEWORK_SEARCH_PATHS = "\"$(LOCAL_LIBRARY_DIR)/Frameworks\" /Local/BuildArea"; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = common.h; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(USER_LIBRARY_DIR)/SaxDrivers-4.5"; + OTHER_CFLAGS = "-DNeXT_RUNTIME=1 -DAPPLE_RUNTIME=1 -DNeXT_Foundation_LIBRARY=1 -DCOCOA_Foundation_LIBRARY=1"; + PRODUCT_NAME = ChangeLogSaxDriver; + WARNING_CFLAGS = "-Wmost"; + WRAPPER_EXTENSION = sax; + }; + dependencies = ( + ); + isa = PBXNativeTarget; + name = ChangeLogSaxDriver; + productInstallPath = "$(HOME)/Library/Bundles"; + productName = ChangeLogSaxDriver; + productReference = 8D5B49B6048680CD000E48DA; + productType = "com.apple.product-type.bundle"; + }; + 8D5B49AF048680CD000E48DA = { + buildActionMask = 2147483647; + files = ( + ADB078C70765E90E003C5ACF, + ADB07E5107666A25003C5ACF, + ADB07DB20766619F003C5ACF, + ADB07DB4076661A8003C5ACF, + ADB07DB6076661B2003C5ACF, + ADB07DB8076661BB003C5ACF, + ADB07DBA076661CF003C5ACF, + ADB07DBC076661DB003C5ACF, + ); + isa = PBXResourcesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 8D5B49B1048680CD000E48DA = { + buildActionMask = 2147483647; + files = ( + ADB078CB0765E936003C5ACF, + ADB07B430766144A003C5ACF, + ADB07B470766145E003C5ACF, + ); + isa = PBXSourcesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 8D5B49B3048680CD000E48DA = { + buildActionMask = 2147483647; + files = ( + ADB0790A0765EBA0003C5ACF, + ADB0790C0765EBD1003C5ACF, + ADB07A800766076A003C5ACF, + ); + isa = PBXFrameworksBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 8D5B49B6048680CD000E48DA = { + explicitFileType = wrapper.cfbundle; + includeInIndex = 0; + isa = PBXFileReference; + path = ChangeLogSaxDriver.sax; + refType = 3; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 8D5B49B7048680CD000E48DA = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = text.xml; + path = Info.plist; + refType = 4; + sourceTree = ""; + }; +//8D0 +//8D1 +//8D2 +//8D3 +//8D4 +//AD0 +//AD1 +//AD2 +//AD3 +//AD4 + ADB078C50765E8B7003C5ACF = { + children = ( + ADB078C80765E936003C5ACF, + ADB07B440766145E003C5ACF, + ADB07B400766144A003C5ACF, + ); + fileEncoding = 5; + indentWidth = 2; + isa = PBXGroup; + name = Headers; + refType = 4; + sourceTree = ""; + }; + ADB078C60765E90E003C5ACF = { + fileEncoding = 5; + indentWidth = 2; + isa = PBXFileReference; + lastKnownFileType = text.plist; + path = "bundle-info.plist"; + refType = 4; + sourceTree = ""; + }; + ADB078C70765E90E003C5ACF = { + fileRef = ADB078C60765E90E003C5ACF; + isa = PBXBuildFile; + settings = { + }; + }; + ADB078C80765E936003C5ACF = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = ChangeLogSaxDriver.h; + refType = 4; + sourceTree = ""; + }; + ADB078C90765E936003C5ACF = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = ChangeLogSaxDriver.m; + refType = 4; + sourceTree = ""; + }; + ADB078CB0765E936003C5ACF = { + fileRef = ADB078C90765E936003C5ACF; + isa = PBXBuildFile; + settings = { + }; + }; + ADB079040765EAA0003C5ACF = { + children = ( + ADB079050765EAC0003C5ACF, + ADB07DBE07666204003C5ACF, + ADB07DC00766620F003C5ACF, + ADB07DC307666236003C5ACF, + ); + indentWidth = 8; + isa = PBXGroup; + name = Makefiles; + refType = 4; + sourceTree = ""; + tabWidth = 8; + usesTabs = 1; + }; + ADB079050765EAC0003C5ACF = { + explicitFileType = sourcecode.make; + fileEncoding = 5; + isa = PBXFileReference; + path = GNUmakefile; + refType = 4; + sourceTree = ""; + }; + ADB079090765EBA0003C5ACF = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = SaxObjC.framework; + path = /Library/Frameworks/SaxObjC.framework; + refType = 0; + sourceTree = ""; + }; + ADB0790A0765EBA0003C5ACF = { + fileRef = ADB079090765EBA0003C5ACF; + isa = PBXBuildFile; + settings = { + }; + }; + ADB0790B0765EBD1003C5ACF = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = Foundation.framework; + path = /System/Library/Frameworks/Foundation.framework; + refType = 0; + sourceTree = ""; + }; + ADB0790C0765EBD1003C5ACF = { + fileRef = ADB0790B0765EBD1003C5ACF; + isa = PBXBuildFile; + settings = { + }; + }; + ADB079110765EDB6003C5ACF = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = common.h; + refType = 4; + sourceTree = ""; + }; + ADB07A7F0766076A003C5ACF = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = NGExtensions.framework; + path = /Library/Frameworks/NGExtensions.framework; + refType = 0; + sourceTree = ""; + }; + ADB07A800766076A003C5ACF = { + fileRef = ADB07A7F0766076A003C5ACF; + isa = PBXBuildFile; + settings = { + }; + }; + ADB07B400766144A003C5ACF = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = "NSCalendarDate+Extensions.h"; + refType = 4; + sourceTree = ""; + }; + ADB07B410766144A003C5ACF = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = "NSCalendarDate+Extensions.m"; + refType = 4; + sourceTree = ""; + }; + ADB07B430766144A003C5ACF = { + fileRef = ADB07B410766144A003C5ACF; + isa = PBXBuildFile; + settings = { + }; + }; + ADB07B440766145E003C5ACF = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = "NSString+Extensions.h"; + refType = 4; + sourceTree = ""; + }; + ADB07B450766145E003C5ACF = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = "NSString+Extensions.m"; + refType = 4; + sourceTree = ""; + }; + ADB07B470766145E003C5ACF = { + fileRef = ADB07B450766145E003C5ACF; + isa = PBXBuildFile; + settings = { + }; + }; + ADB07DB10766619F003C5ACF = { + fileEncoding = 5; + isa = PBXFileReference; + lastKnownFileType = text; + path = README; + refType = 4; + sourceTree = ""; + }; + ADB07DB20766619F003C5ACF = { + fileRef = ADB07DB10766619F003C5ACF; + isa = PBXBuildFile; + settings = { + }; + }; + ADB07DB3076661A8003C5ACF = { + fileEncoding = 5; + isa = PBXFileReference; + lastKnownFileType = text; + path = COPYRIGHT; + refType = 4; + sourceTree = ""; + }; + ADB07DB4076661A8003C5ACF = { + fileRef = ADB07DB3076661A8003C5ACF; + isa = PBXBuildFile; + settings = { + }; + }; + ADB07DB5076661B2003C5ACF = { + fileEncoding = 5; + isa = PBXFileReference; + lastKnownFileType = text; + path = COPYING; + refType = 4; + sourceTree = ""; + }; + ADB07DB6076661B2003C5ACF = { + fileRef = ADB07DB5076661B2003C5ACF; + isa = PBXBuildFile; + settings = { + }; + }; + ADB07DB7076661BB003C5ACF = { + fileEncoding = 5; + isa = PBXFileReference; + lastKnownFileType = text; + path = AUTHORS; + refType = 4; + sourceTree = ""; + }; + ADB07DB8076661BB003C5ACF = { + fileRef = ADB07DB7076661BB003C5ACF; + isa = PBXBuildFile; + settings = { + }; + }; + ADB07DB9076661CF003C5ACF = { + fileEncoding = 5; + indentWidth = 8; + isa = PBXFileReference; + lastKnownFileType = text; + path = ChangeLog; + refType = 4; + sourceTree = ""; + tabWidth = 8; + usesTabs = 1; + }; + ADB07DBA076661CF003C5ACF = { + fileRef = ADB07DB9076661CF003C5ACF; + isa = PBXBuildFile; + settings = { + }; + }; + ADB07DBB076661DB003C5ACF = { + explicitFileType = sourcecode.make; + fileEncoding = 5; + indentWidth = 8; + isa = PBXFileReference; + path = Version; + refType = 4; + sourceTree = ""; + tabWidth = 8; + }; + ADB07DBC076661DB003C5ACF = { + fileRef = ADB07DBB076661DB003C5ACF; + isa = PBXBuildFile; + settings = { + }; + }; + ADB07DBE07666204003C5ACF = { + explicitFileType = sourcecode.make; + fileEncoding = 5; + isa = PBXFileReference; + path = GNUmakefile.preamble; + refType = 4; + sourceTree = ""; + }; + ADB07DC00766620F003C5ACF = { + explicitFileType = sourcecode.make; + fileEncoding = 5; + isa = PBXFileReference; + path = GNUmakefile.postamble; + refType = 4; + sourceTree = ""; + }; + ADB07DC307666236003C5ACF = { + explicitFileType = sourcecode.make; + fileEncoding = 5; + isa = PBXFileReference; + path = fhs.make; + refType = 4; + sourceTree = ""; + }; + ADB07E5007666A25003C5ACF = { + explicitFileType = text.plist; + fileEncoding = 5; + indentWidth = 2; + isa = PBXFileReference; + path = default.locale; + refType = 4; + sourceTree = ""; + }; + ADB07E5107666A25003C5ACF = { + fileRef = ADB07E5007666A25003C5ACF; + isa = PBXBuildFile; + settings = { + }; + }; + }; + rootObject = 089C1669FE841209C02AAC07; +} diff --git a/sope-xml/ChangeLogSaxDriver/GNUmakefile b/sope-xml/ChangeLogSaxDriver/GNUmakefile new file mode 100644 index 00000000..93c3a95a --- /dev/null +++ b/sope-xml/ChangeLogSaxDriver/GNUmakefile @@ -0,0 +1,23 @@ +# GNUstep makefile + +-include ../../config.make +include $(GNUSTEP_MAKEFILES)/common.make +-include ../../Version +-include ./Version + +BUNDLE_NAME = ChangeLogSaxDriver +BUNDLE_EXTENSION = .sax +BUNDLE_INSTALL_DIR = $(GNUSTEP_INSTALLATION_DIR)/Library/SaxDrivers-$(MAJOR_VERSION).$(MINOR_VERSION)/ + +ChangeLogSaxDriver_OBJC_FILES = \ + ChangeLogSaxDriver.m \ + NSString+Extensions.m \ + NSCalendarDate+Extensions.m + +ChangeLogSaxDriver_RESOURCE_FILES = bundle-info.plist default.locale + + +-include GNUmakefile.preamble +include $(GNUSTEP_MAKEFILES)/bundle.make +-include GNUmakefile.postamble +-include fhs.make diff --git a/sope-xml/ChangeLogSaxDriver/GNUmakefile.postamble b/sope-xml/ChangeLogSaxDriver/GNUmakefile.postamble new file mode 100644 index 00000000..ef22ecff --- /dev/null +++ b/sope-xml/ChangeLogSaxDriver/GNUmakefile.postamble @@ -0,0 +1,5 @@ +# aftermath + +after-all :: + @(cp bundle-info.plist \ + $(GNUSTEP_BUILD_DIR)/$(BUNDLE_NAME)$(BUNDLE_EXTENSION)) diff --git a/sope-xml/ChangeLogSaxDriver/GNUmakefile.preamble b/sope-xml/ChangeLogSaxDriver/GNUmakefile.preamble new file mode 100644 index 00000000..85034d54 --- /dev/null +++ b/sope-xml/ChangeLogSaxDriver/GNUmakefile.preamble @@ -0,0 +1,17 @@ +# compilation settings + +SOPE_ROOT=../.. +SOPE_OBJ_ROOT=$(GNUSTEP_BUILD_DIR)/$(SOPE_ROOT) + +ADDITIONAL_INCLUDE_DIRS += \ + -I$(SOPE_ROOT)/sope-xml \ + -I$(SOPE_ROOT)/sope-core/NGExtensions + +BUNDLE_LIBS += \ + -lSaxObjC -lNGExtensions + +ADDITIONAL_BUNDLE_LIBS += $(BUNDLE_LIBS) + +ADDITIONAL_LIB_DIRS += \ + -L$(SOPE_OBJ_ROOT)/sope-xml/SaxObjC/$(GNUSTEP_OBJ_DIR_NAME) \ + -L$(SOPE_OBJ_ROOT)/sope-core/NGExtensions/$(GNUSTEP_OBJ_DIR_NAME) diff --git a/sope-xml/ChangeLogSaxDriver/Info.plist b/sope-xml/ChangeLogSaxDriver/Info.plist new file mode 100644 index 00000000..8b57c0c4 --- /dev/null +++ b/sope-xml/ChangeLogSaxDriver/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ChangeLogSaxDriver + CFBundleIconFile + + CFBundleIdentifier + com.mulle-kybernetik.znek.ChangeLogSaxDriver + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleSignature + ???? + CFBundleVersion + 4.5 + NSPrincipalClass + + + diff --git a/sope-xml/ChangeLogSaxDriver/NSCalendarDate+Extensions.h b/sope-xml/ChangeLogSaxDriver/NSCalendarDate+Extensions.h new file mode 100644 index 00000000..ab4e3f5e --- /dev/null +++ b/sope-xml/ChangeLogSaxDriver/NSCalendarDate+Extensions.h @@ -0,0 +1,37 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OpenGroupware.org. + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo 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 Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ + +#ifndef __ChangeLogSaxDriver_NSCalendarDate_Extensions_H_ +#define __ChangeLogSaxDriver_NSCalendarDate_Extensions_H_ + +#import + +@interface NSCalendarDate (ChangeLogSaxDriverExtensions) + +/* see http://www.w3.org/TR/NOTE-datetime */ +/* this is Complete date plus hours, minutes and seconds, with timezone + set to 'Zulu', i.e. 1994-11-05T13:15:30Z +*/ +- (NSString *)w3OrgDateTimeRepresentation; + +@end + +#endif /* __ChangeLogSaxDriver_NSCalendarDate_Extensions_H_ */ diff --git a/sope-xml/ChangeLogSaxDriver/NSCalendarDate+Extensions.m b/sope-xml/ChangeLogSaxDriver/NSCalendarDate+Extensions.m new file mode 100644 index 00000000..093aa6bb --- /dev/null +++ b/sope-xml/ChangeLogSaxDriver/NSCalendarDate+Extensions.m @@ -0,0 +1,44 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OpenGroupware.org. + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo 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 Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ + +#include "NSCalendarDate+Extensions.h" + +@implementation NSCalendarDate (ChangeLogSaxDriverExtensions) + +/* set to 'Zulu', i.e. 1994-11-05T13:15:30Z */ +- (NSString *)w3OrgDateTimeRepresentation { + static NSTimeZone *zulu = nil; + NSCalendarDate *date; + NSString *desc; + + if(!zulu) + zulu = [[NSTimeZone timeZoneForSecondsFromGMT:0] retain]; + + date = [self copy]; + [date setTimeZone:zulu]; + desc = [NSString stringWithFormat:@"%04d-%02d-%02dT%02d:%02d:%02dZ", + [date yearOfCommonEra], [date monthOfYear], [date dayOfMonth], + [date hourOfDay], [date minuteOfHour], [date secondOfMinute]]; + [date release]; + return desc; +} + +@end diff --git a/sope-xml/ChangeLogSaxDriver/NSString+Extensions.h b/sope-xml/ChangeLogSaxDriver/NSString+Extensions.h new file mode 100644 index 00000000..995a8206 --- /dev/null +++ b/sope-xml/ChangeLogSaxDriver/NSString+Extensions.h @@ -0,0 +1,34 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OpenGroupware.org. + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo 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 Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ + +#ifndef __ChangeLogSaxDriver_NSString_Extensions_H_ +#define __ChangeLogSaxDriver_NSString_Extensions_H_ + +#import + +@interface NSString (ChangeLogSaxDriverExtensions) + +- (BOOL)parseDate:(NSCalendarDate **)_date andAuthor:(NSString **)_author; +- (void)getRealName:(NSString **)_realName andEmail:(NSString **)_email; + +@end + +#endif /* __ChangeLogSaxDriver_NSString_Extensions_H_ */ diff --git a/sope-xml/ChangeLogSaxDriver/NSString+Extensions.m b/sope-xml/ChangeLogSaxDriver/NSString+Extensions.m new file mode 100644 index 00000000..0cfa68cc --- /dev/null +++ b/sope-xml/ChangeLogSaxDriver/NSString+Extensions.m @@ -0,0 +1,187 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OpenGroupware.org. + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo 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 Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ + +#include "NSString+Extensions.h" +#include "common.h" + +@implementation NSString (ChangeLogSaxDriverExtensions) + +typedef struct { + unsigned minLength; + unsigned offset; + BOOL hasTime; + BOOL hasTimeZone; + NSString *format; +} dateFormatTest; + +static dateFormatTest formats[] = { + { 24, 4, YES, NO, @"%b %d %H:%M:%S %Y" }, + { 10, 0, NO, NO, @"%Y-%m-%d" }, + { 12, 0, NO, NO, @"%b %d, %Y" }, + { 13, 0, NO, NO, @"%b %d, %Y" }, + { 15, 5, NO, NO, @"%b %d %Y" }, + { 16, 0, NO, NO, @"%a %b %d %Y" }, + { 23, 3, YES, NO, @"%b %d %H:%M:%S %Y" }, + { 24, 4, YES, NO, @"%d %b %Y %H:%M:%S" }, + { 25, 4, YES, NO, @"%b %d %H:%M:%S %Y" }, + { 25, 4, YES, NO, @"%B %d %H:%M:%S %Y" }, + { 28, 4, YES, YES, @"%b %d %H:%M:%S %Z %Y" }, + { 30, 0, YES, YES, @"%a %b %d %H:%M:%S %Z %Y" }, + { 0, 0, NO, NO, nil } /* end marker */ +}; + +typedef struct { + unsigned minLength; + unsigned start; + unsigned stop; + unsigned contAt; + BOOL hasTime; + BOOL hasTimeZone; + NSString *format; +} complexDateFormatTest; + +static complexDateFormatTest complexFormats[] = { + { 28, 4, 20, 24, YES, NO, @"%b %d %H:%M:%S %Y" }, + { 29, 4, 20, 25, YES, NO, @"%b %d %H:%M:%S %Y" }, + { 29, 4, 20, 24, YES, NO, @"%b %d %H:%M:%S %Y" }, + { 0, 0, 0, 0, NO, NO, nil } /* end marker */ +}; + +- (BOOL)parseDate:(NSCalendarDate **)_date andAuthor:(NSString **)_author { + static NSTimeZone *gmt = nil; + static NSDictionary *locale = nil; + NSString *s, *format; + NSCalendarDate *date; + NSRange r; + unsigned i, endLoc, len; + BOOL hasTime, hasTimeZone; + + if(!gmt) { + NSBundle *bundle; + NSString *path; + + gmt = [[NSTimeZone timeZoneForSecondsFromGMT:0] retain]; + + bundle = [NSBundle bundleForClass:[self class]]; + path = [bundle pathForResource:@"default" ofType:@"locale"]; + if(path != nil) { + locale = [[NSDictionary dictionaryWithContentsOfFile:path] retain]; + } + } + + date = nil; + endLoc = 0, i = 0; + len = [self length]; + + /* perform basic tests */ + while((endLoc = formats[i].minLength) != 0 && endLoc < len) { + r = NSMakeRange(formats[i].offset, + endLoc - formats[i].offset); + s = [self substringWithRange:r]; + format = formats[i].format; + date = [NSCalendarDate dateWithString:s + calendarFormat:format + locale:locale]; + if(date) { + hasTime = formats[i].hasTime; + hasTimeZone = formats[i].hasTimeZone; + break; + } + i++; + } + + if(!date) { + /* perform complex tests */ + i = 0; + while((endLoc = complexFormats[i].minLength) != 0 && endLoc < len) + { + + r = NSMakeRange(complexFormats[i].start, + complexFormats[i].stop - complexFormats[i].start); + s = [self substringWithRange:r]; + r = NSMakeRange(complexFormats[i].contAt, + endLoc - complexFormats[i].contAt); + s = [NSString stringWithFormat:@"%@%@", + s, + [self substringWithRange:r]]; + format = complexFormats[i].format; + date = [NSCalendarDate dateWithString:s + calendarFormat:format + locale:locale]; + if(date) { + hasTime = complexFormats[i].hasTime; + hasTimeZone = complexFormats[i].hasTimeZone; + break; + } + i++; + } + } + + if(date) { + if(!hasTimeZone && !hasTime) + date = [NSCalendarDate dateWithYear:[date yearOfCommonEra] + month:[date monthOfYear] + day:[date dayOfMonth] + hour:12 + minute:0 + second:0 + timeZone:gmt]; + else if(!hasTimeZone) + [date setTimeZone:gmt]; + else if(!hasTime) + date = [date hour:12 minute:0]; + + *_author = [self substringFromIndex:endLoc]; + } + else { + *_author = nil; + } + *_date = date; + return (date != nil) ? YES : NO; +} + +- (void)getRealName:(NSString **)_realName andEmail:(NSString **)_email { + NSRange r; + NSString *s; + + s = [self stringByTrimmingSpaces]; + r = [s rangeOfString:@"<"]; + if(r.length == 0) { + *_realName = s; + *_email = nil; + return; + } + if(r.location != 0) { + NSString *rn; + + rn = [s substringToIndex:r.location]; + *_realName = [rn stringByTrimmingTailSpaces]; + } + else { + *_realName = @""; + } + s = [s substringFromIndex:NSMaxRange(r)]; + s = [s stringByTrimmingTailSpaces]; + s = [s substringToIndex:[s length] - 1]; + *_email = s; +} + +@end diff --git a/sope-xml/ChangeLogSaxDriver/README b/sope-xml/ChangeLogSaxDriver/README new file mode 100644 index 00000000..e08a9e08 --- /dev/null +++ b/sope-xml/ChangeLogSaxDriver/README @@ -0,0 +1,70 @@ +Overview +======== + +ChangeLogSaxDriver is a SAX driver for reading, well, ChangeLogs. + + +Generated XML +============= + +A ChangeLog like this: +--- snip --- +2004-11-22 Helge Hess + + * v4.5.97 + + * WOContext.m: move some categories into main class implementation + + * WORequestHandler.m: bind default logger to WODebuggingEnabled + +2004-11-21 Helge Hess + + * WODirectActionRequestHandler.m: minor code cleanups (v4.5.96) + +--- snap --- + +gets tranformed into this: + +--- snip --- + + + + Helge Hess + + + + v4.5.97 + + + WOContext.m: move some categories into main class implementation + + + WORequestHandler.m: bind default logger to WODebuggingEnabled + + + + + + "Helge Hess" + + + + WODirectActionRequestHandler.m: minor code cleanups (v4.5.96) + + + + +--- snap --- + + +Notes +===== + +The generated date stamps follow the w3.org recommendation at +http://www.w3.org/TR/NOTE-datetime. Specifically, this is the format described +as "complete date plus hours, minutes and seconds", with timezone set to 'Zulu' +(GMT). + +If the original format didn't contain timezone information, the resulting +timezone is set to GMT. If the original format didn't contain time information, +the resulting time information is set to 12:00:00. diff --git a/sope-xml/ChangeLogSaxDriver/Version b/sope-xml/ChangeLogSaxDriver/Version new file mode 100644 index 00000000..b97a76b1 --- /dev/null +++ b/sope-xml/ChangeLogSaxDriver/Version @@ -0,0 +1,3 @@ +# Version file + +SUBMINOR_VERSION:=0 diff --git a/sope-xml/ChangeLogSaxDriver/bundle-info.plist b/sope-xml/ChangeLogSaxDriver/bundle-info.plist new file mode 100644 index 00000000..0f072d6b --- /dev/null +++ b/sope-xml/ChangeLogSaxDriver/bundle-info.plist @@ -0,0 +1,23 @@ +{ + CVS = "$Id$"; + //bundleHandler = NSObject; + + requires = { + bundleManagerVersion = 1; + classes = ( + { name = NSObject; } + ); + }; + + provides = { + SAXDrivers = ( + { + name = ChangeLogSaxDriver; + sourceTypes = ( "application/x-changelog" ); + }, + ); + classes = ( + { name = ChangeLogSaxDriver; }, + ); + }; +} diff --git a/sope-xml/ChangeLogSaxDriver/common.h b/sope-xml/ChangeLogSaxDriver/common.h new file mode 100644 index 00000000..9d822c65 --- /dev/null +++ b/sope-xml/ChangeLogSaxDriver/common.h @@ -0,0 +1,30 @@ +/* + Copyright (C) 2004 Marcus Mueller + + This file is part of OpenGroupware.org. + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo 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 Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ + +#ifndef __ChangeLogSaxDriver_common_H_ +#define __ChangeLogSaxDriver_common_H_ + +#import +#include +#include +#include + +#endif /* __ChangeLogSaxDriver_common_H_ */ diff --git a/sope-xml/ChangeLogSaxDriver/default.locale b/sope-xml/ChangeLogSaxDriver/default.locale new file mode 100644 index 00000000..fb04bffa --- /dev/null +++ b/sope-xml/ChangeLogSaxDriver/default.locale @@ -0,0 +1,10 @@ +{ + NSLocaleCode = "en"; /* ISO 639-1 */ + NSLanguageCode = "eng"; /* ISO 639-2 */ + NSParentContext = ""; + + NSMonthNameArray = (January, February, March, April, May, June, July, August, September, October, November, December); + NSShortMonthNameArray = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); + NSShortWeekDayNameArray = (Sun, Mon, Tue, Wed, Thu, Fri, Sat); + NSWeekDayNameArray = (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday); +} diff --git a/sope-xml/ChangeLogSaxDriver/fhs.make b/sope-xml/ChangeLogSaxDriver/fhs.make new file mode 100644 index 00000000..56604151 --- /dev/null +++ b/sope-xml/ChangeLogSaxDriver/fhs.make @@ -0,0 +1,25 @@ +# postprocessing + +# FHS support (this is a hack and is going to be done by gstep-make!) + +ifneq ($(FHS_INSTALL_ROOT),) + +FHS_LIB_DIR=$(FHS_INSTALL_ROOT)/lib/ +FHS_SAX_DIR=$(FHS_LIB_DIR)sope-$(MAJOR_VERSION).$(MINOR_VERSION)/saxdrivers/ + +fhs-sax-dirs :: + $(MKDIRS) $(FHS_SAX_DIR) + +move-bundles-to-fhs :: fhs-sax-dirs + @echo "moving bundles $(BUNDLE_INSTALL_DIR) to $(FHS_SAX_DIR) .." + for i in $(BUNDLE_NAME); do \ + j="$(FHS_SAX_DIR)/$${i}$(BUNDLE_EXTENSION)"; \ + if test -d $$j; then rm -r $$j; fi; \ + mv "$(BUNDLE_INSTALL_DIR)/$${i}$(BUNDLE_EXTENSION)" $$j; \ + done + +move-to-fhs :: move-bundles-to-fhs + +after-install :: move-to-fhs + +endif diff --git a/sope-xml/ChangeLogSaxDriver/version.plist b/sope-xml/ChangeLogSaxDriver/version.plist new file mode 100644 index 00000000..53bf3a3f --- /dev/null +++ b/sope-xml/ChangeLogSaxDriver/version.plist @@ -0,0 +1,16 @@ + + + + + BuildVersion + 12 + CFBundleVersion + 1.0 + ProductBuildVersion + 7K571 + ProjectName + DevToolsWizardTemplates + SourceVersion + 3870000 + + diff --git a/sope-xml/SaxObjC/SaxObjC.xcode/project.pbxproj b/sope-xml/SaxObjC/SaxObjC.xcode/project.pbxproj index eafb73bf..72fa1b3f 100644 --- a/sope-xml/SaxObjC/SaxObjC.xcode/project.pbxproj +++ b/sope-xml/SaxObjC/SaxObjC.xcode/project.pbxproj @@ -373,7 +373,7 @@ ); buildSettings = { DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 4.5.44; + DYLIB_CURRENT_VERSION = 4.5.47; FRAMEWORK_VERSION = A; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = common.h; -- 2.39.5