summaryrefslogtreecommitdiff
path: root/svtools/source/misc/ownlist.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svtools/source/misc/ownlist.cxx')
-rw-r--r--svtools/source/misc/ownlist.cxx325
1 files changed, 325 insertions, 0 deletions
diff --git a/svtools/source/misc/ownlist.cxx b/svtools/source/misc/ownlist.cxx
new file mode 100644
index 000000000000..b97614503928
--- /dev/null
+++ b/svtools/source/misc/ownlist.cxx
@@ -0,0 +1,325 @@
+/*************************************************************************
+ *
+ * $RCSfile: ownlist.cxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-18 16:59:02 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library 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 this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+#include <ctype.h>
+#include <stdio.h>
+
+#include <ownlist.hxx>
+
+//=========================================================================
+//============== SvCommandList ============================================
+//=========================================================================
+PRV_SV_IMPL_OWNER_LIST(SvCommandList,SvCommand)
+
+
+static String parseString(const String & rCmd, USHORT * pIndex)
+{
+ String result;
+
+ if(rCmd.GetChar( *pIndex ) == '\"') {
+ (*pIndex) ++;
+
+ USHORT begin = *pIndex;
+
+ while(*pIndex < rCmd.Len() && rCmd.GetChar((*pIndex) ++) != '\"');
+
+ result = String(rCmd.Copy(begin, *pIndex - begin - 1));
+ }
+
+ return result;
+}
+
+static String parseWord(const String & rCmd, USHORT * pIndex)
+{
+ USHORT begin = *pIndex;
+
+ while(*pIndex < rCmd.Len() && !isspace(rCmd.GetChar(*pIndex)) && rCmd.GetChar(*pIndex) != '=')
+ (*pIndex) ++;
+
+ return String(rCmd.Copy(begin, *pIndex - begin));
+}
+
+static void eatSpace(const String & rCmd, USHORT * pIndex)
+{
+ while(*pIndex < rCmd.Len() && isspace(rCmd.GetChar(*pIndex)))
+ (*pIndex) ++;
+}
+
+
+//=========================================================================
+BOOL SvCommandList::AppendCommands
+(
+ const String & rCmd, /* Dieser Text wird in Kommandos umgesetzt */
+ USHORT * pEaten /* Anzahl der Zeichen, die gelesen wurden */
+)
+/* [Beschreibung]
+
+ Es wird eine Text geparsed und die einzelnen Kommandos werden an
+ die Liste angeh"angt.
+
+ [R"uckgabewert]
+
+ BOOL TRUE, der Text wurde korrekt geparsed.
+ FALSE, der Text wurde nicht korrekt geparsed.
+*/
+{
+ USHORT index = 0;
+ while(index < rCmd.Len())
+ {
+
+ eatSpace(rCmd, &index);
+ String name = (rCmd.GetChar(index) == '\"') ? parseString(rCmd, &index) : parseWord(rCmd, &index);
+
+ eatSpace(rCmd, &index);
+ String value;
+ if(index < rCmd.Len() && rCmd.GetChar(index) == '=')
+ {
+ index ++;
+
+ eatSpace(rCmd, &index);
+ value = (rCmd.GetChar(index) == '\"') ? parseString(rCmd, &index) : parseWord(rCmd, &index);
+ }
+
+ SvCommand * pCmd = new SvCommand(name, value);
+ aTypes.Insert(pCmd, LIST_APPEND);
+ }
+
+ *pEaten = index;
+
+// USHORT nPos = 0;
+// while( nPos < rCmd.Len() )
+// {
+// // ein Zeichen ? Dann faengt hier eine Option an
+// if( isalpha( rCmd[nPos] ) )
+// {
+// String aValue;
+// USHORT nStt = nPos;
+// register char c;
+
+// while( nPos < rCmd.Len() &&
+// ( isalnum(c=rCmd[nPos]) || '-'==c || '.'==c ) )
+// nPos++;
+
+// String aToken( rCmd.Copy( nStt, nPos-nStt ) );
+
+// while( nPos < rCmd.Len() &&
+// ( !String::IsPrintable( (c=rCmd[nPos]),
+// RTL_TEXTENCODING_MS_1252 ) || isspace(c) ) )
+// nPos++;
+
+// // hat die Option auch einen Wert?
+// if( nPos!=rCmd.Len() && '='==c )
+// {
+// nPos++;
+
+// while( nPos < rCmd.Len() &&
+// ( !String::IsPrintable( (c=rCmd[nPos]),
+// RTL_TEXTENCODING_MS_1252 ) || isspace(c) ) )
+// nPos++;
+
+// if( nPos != rCmd.Len() )
+// {
+// USHORT nLen = 0;
+// nStt = nPos;
+// if( '"' == c )
+// {
+// nPos++; nStt++;
+// while( nPos < rCmd.Len() &&
+// '"' != rCmd[nPos] )
+// nPos++, nLen++;
+// if( nPos!=rCmd.Len() )
+// nPos++;
+// }
+// else
+// // hier sind wir etwas laxer als der
+// // Standard und erlauben alles druckbare
+// while( nPos < rCmd.Len() &&
+// String::IsPrintable( (c=rCmd[nPos]),
+// RTL_TEXTENCODING_MS_1252 ) &&
+// !isspace( c ) )
+// nPos++, nLen++;
+
+// if( nLen )
+// aValue = rCmd( nStt, nLen );
+// }
+// }
+
+// SvCommand * pCmd = new SvCommand( aToken, aValue );
+// aTypes.Insert( pCmd, LIST_APPEND );
+// }
+// else
+// // white space un unerwartete Zeichen ignorieren wie
+// nPos++;
+// }
+// *pEaten = nPos;
+ return TRUE;
+}
+
+//=========================================================================
+String SvCommandList::GetCommands() const
+/* [Beschreibung]
+
+ Die Kommandos in der Liste werden als Text hintereinander, durch ein
+ Leerzeichen getrennt geschrieben. Der Text muss nicht genauso
+ aussehen wie der in <SvCommandList::AppendCommands()> "ubergebene.
+
+ [R"uckgabewert]
+
+ String Die Kommandos werden zur"uckgegeben.
+*/
+{
+ String aRet;
+ for( ULONG i = 0; i < aTypes.Count(); i++ )
+ {
+ if( i != 0 )
+ aRet += ' ';
+ SvCommand * pCmd = (SvCommand *)aTypes.GetObject( i );
+ aRet += pCmd->GetCommand();
+ if( pCmd->GetArgument().Len() )
+ {
+ aRet.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "=\"" ) );
+ aRet += pCmd->GetArgument();
+ aRet.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "\"" ) );
+ }
+ }
+ return aRet;
+}
+
+//=========================================================================
+SvCommand & SvCommandList::Append
+(
+ const String & rCommand, /* das Kommando */
+ const String & rArg /* dasArgument des Kommandos */
+)
+/* [Beschreibung]
+
+ Es wird eine Objekt vom Typ SvCommand erzeugt und an die Liste
+ angeh"angt.
+
+ [R"uckgabewert]
+
+ SvCommand & Das erteugte Objekt wird zur"uckgegeben.
+*/
+{
+ SvCommand * pCmd = new SvCommand( rCommand, rArg );
+ aTypes.Insert( pCmd, LIST_APPEND );
+ return *pCmd;
+}
+
+//=========================================================================
+SvStream & operator >>
+(
+ SvStream & rStm, /* Stream aus dem gelesen wird */
+ SvCommandList & rThis /* Die zu f"ullende Liste */
+)
+/* [Beschreibung]
+
+ Die Liste mit ihren Elementen wird gelesen. Das Format ist:
+ 1. Anzahl der Elemente
+ 2. Alle Elemente
+
+ [R"uckgabewert]
+
+ SvStream & Der "ubergebene Stream.
+*/
+{
+ UINT32 nCount = 0;
+ rStm >> nCount;
+ if( !rStm.GetError() )
+ {
+ while( nCount-- )
+ {
+ SvCommand * pCmd = new SvCommand();
+ rStm >> *pCmd;
+ rThis.aTypes.Insert( pCmd, LIST_APPEND );
+ }
+ }
+ return rStm;
+}
+
+//=========================================================================
+SvStream & operator <<
+(
+ SvStream & rStm, /* Stream in den geschrieben wird */
+ const SvCommandList & rThis /* Die zu schreibende Liste */
+)
+/* [Beschreibung]
+
+ Die Liste mit ihren Elementen wir geschrieben. Das Format ist:
+ 1. Anzahl der Elemente
+ 2. Alle Elemente
+
+ [R"uckgabewert]
+
+ SvStream & Der "ubergebene Stream.
+*/
+{
+ UINT32 nCount = rThis.aTypes.Count();
+ rStm << nCount;
+
+ for( UINT32 i = 0; i < nCount; i++ )
+ {
+ SvCommand * pCmd = (SvCommand *)rThis.aTypes.GetObject( i );
+ rStm << *pCmd;
+ }
+ return rStm;
+}
+
+