Properties based on Hashtable : Hashtable « Collections Data Structure « C# / C Sharp






Properties based on Hashtable

  

/*
 * $Id: StringTokenizer.cs,v 1.4 2006/06/16 10:52:26 psoares33 Exp $
 *
 * Copyright 2006 by Paulo Soares.
 *
 * The contents of this file are subject to the Mozilla Public 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.mozilla.org/MPL/
 *
 * Software distributed under the License isp distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the License.
 *
 * The Original Code isp 'iText, a free JAVA-PDF library'.
 *
 * The Initial Developer of the Original Code isp Bruno Lowagie. Portions created by
 * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
 * All Rights Reserved.
 * Co-Developer of the code isp Paulo Soares. Portions created by the Co-Developer
 * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
 *
 * Contributor(s): all the names of the contributors are added in the source code
 * where applicable.
 *
 * Alternatively, the contents of this file may be used under the terms of the
 * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
 * provisions of LGPL are applicable instead of those above.  If you wish to
 * allow use of your version of this file only under the terms of the LGPL
 * License and not to allow others to use your version of this file under
 * the MPL, indicate your decision by deleting the provisions above and
 * replace them with the notice and other provisions required by the LGPL.
 * If you do not delete the provisions above, a recipient may use your version
 * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
 *
 * This library isp free software; you can redistribute it and/or modify it
 * under the terms of the MPL as stated above or under the terms of the GNU
 * Library General Public License as published by the Free Software Foundation;
 * either version 2 of the License, or any later version.
 *
 * This library isp 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 Library general Public License for more
 * details.
 *
 * If you didn't download this code from the following link, you should check if
 * you aren't using an obsolete version:
 * http://www.lowagie.com/iText/
 */

using System;
using System.Text;
using System.IO;
using System.Collections;

namespace System.util
{
    /// <summary>
    /// Summary description for Properties.
    /// </summary>
    public class Properties
    {
        private Hashtable _col;
        private const string whiteSpaceChars = " \t\r\n\f";
        private const string keyValueSeparators = "=: \t\r\n\f";
        private const string strictKeyValueSeparators = "=:";

        public Properties()
        {
            _col = new Hashtable();
        }

        public string Remove(string key) {
            string retval = (string)_col[key];
            _col.Remove(key);
            return retval;
        }

        public IEnumerator GetEnumerator() {
            return _col.GetEnumerator();
        }

        public bool ContainsKey(string key) {
            return _col.ContainsKey(key);            
        }

        public virtual void Add(string key, string value) {
            _col[key] = value;        
        }

        public void AddAll(Properties col) {
            foreach (string itm in col.Keys) {
                _col[itm] = col[itm];
            }
        }

        public int Count {
            get {
                return _col.Count;
            }
        }

        public virtual string this[string key] {
            get {
                return (string)_col[key];
            }

            set {
                _col[key] = value;
            }
        }

        public ICollection Keys {
            get {
                return _col.Keys;
            }
        }

        public void Clear() {
            _col.Clear();
        }

        public void Load(Stream inStream) {
            StreamReader inp = new StreamReader(inStream, Encoding.GetEncoding(1252));
            while (true) {
                // Get next line
                String line = inp.ReadLine();
                if (line == null)
                    return;

                if (line.Length > 0) {
                
                    // Find start of key
                    int len = line.Length;
                    int keyStart;
                    for (keyStart=0; keyStart<len; keyStart++)
                        if (whiteSpaceChars.IndexOf(line[keyStart]) == -1)
                            break;

                    // Blank lines are ignored
                    if (keyStart == len)
                        continue;

                    // Continue lines that end in slashes if they are not comments
                    char firstChar = line[keyStart];
                    if ((firstChar != '#') && (firstChar != '!')) {
                        while (ContinueLine(line)) {
                            String nextLine = inp.ReadLine();
                            if (nextLine == null)
                                nextLine = "";
                            String loppedLine = line.Substring(0, len-1);
                            // Advance beyond whitespace on new line
                            int startIndex;
                            for (startIndex=0; startIndex<nextLine.Length; startIndex++)
                                if (whiteSpaceChars.IndexOf(nextLine[startIndex]) == -1)
                                    break;
                            nextLine = nextLine.Substring(startIndex,nextLine.Length - startIndex);
                            line = loppedLine+nextLine;
                            len = line.Length;
                        }

                        // Find separation between key and value
                        int separatorIndex;
                        for (separatorIndex=keyStart; separatorIndex<len; separatorIndex++) {
                            char currentChar = line[separatorIndex];
                            if (currentChar == '\\')
                                separatorIndex++;
                            else if (keyValueSeparators.IndexOf(currentChar) != -1)
                                break;
                        }

                        // Skip over whitespace after key if any
                        int valueIndex;
                        for (valueIndex=separatorIndex; valueIndex<len; valueIndex++)
                            if (whiteSpaceChars.IndexOf(line[valueIndex]) == -1)
                                break;

                        // Skip over one non whitespace key value separators if any
                        if (valueIndex < len)
                            if (strictKeyValueSeparators.IndexOf(line[valueIndex]) != -1)
                                valueIndex++;

                        // Skip over white space after other separators if any
                        while (valueIndex < len) {
                            if (whiteSpaceChars.IndexOf(line[valueIndex]) == -1)
                                break;
                            valueIndex++;
                        }
                        String key = line.Substring(keyStart, separatorIndex - keyStart);
                        String value = (separatorIndex < len) ? line.Substring(valueIndex, len - valueIndex) : "";

                        // Convert then store key and value
                        key = LoadConvert(key);
                        value = LoadConvert(value);
                        Add(key, value);
                    }
                }
            }
        }

        /*
        * Converts encoded &#92;uxxxx to unicode chars
        * and changes special saved chars to their original forms
        */
        private String LoadConvert(String theString) {
            char aChar;
            int len = theString.Length;
            StringBuilder outBuffer = new StringBuilder(len);

            for (int x=0; x<len; ) {
                aChar = theString[x++];
                if (aChar == '\\') {
                    aChar = theString[x++];
                    if (aChar == 'u') {
                        // Read the xxxx
                        int value=0;
                        for (int i=0; i<4; i++) {
                            aChar = theString[x++];
                            switch (aChar) {
                                case '0': case '1': case '2': case '3': case '4':
                                case '5': case '6': case '7': case '8': case '9':
                                    value = (value << 4) + aChar - '0';
                                    break;
                                case 'a': case 'b': case 'c':
                                case 'd': case 'e': case 'f':
                                    value = (value << 4) + 10 + aChar - 'a';
                                    break;
                                case 'A': case 'B': case 'C':
                                case 'D': case 'E': case 'F':
                                    value = (value << 4) + 10 + aChar - 'A';
                                    break;
                                default:
                                    throw new ArgumentException(
                                        "Malformed \\uxxxx encoding.");
                            }
                        }
                        outBuffer.Append((char)value);
                    } else {
                        if (aChar == 't') aChar = '\t';
                        else if (aChar == 'r') aChar = '\r';
                        else if (aChar == 'n') aChar = '\n';
                        else if (aChar == 'f') aChar = '\f';
                        outBuffer.Append(aChar);
                    }
                } else
                    outBuffer.Append(aChar);
            }
            return outBuffer.ToString();
        }

        private bool ContinueLine(String line) {
            int slashCount = 0;
            int index = line.Length - 1;
            while ((index >= 0) && (line[index--] == '\\'))
                slashCount++;
            return (slashCount % 2 == 1);
        }
    }
}

   
    
  








Related examples in the same category

1.Compares the efficiency of the hash map implementation with the tree mapCompares the efficiency of the hash map implementation with the tree map
2.Implement GetHashCode method and store it in a hashtableImplement GetHashCode method and store it in a hashtable
3.Add value to Hashtable and loop through the value key pairsAdd value to Hashtable and loop through the value key pairs
4.Enumerating a hash table collectionEnumerating a hash table collection
5.illustrates the use of a Hashtableillustrates the use of a Hashtable
6.illustrates the use of the Hashtable methodsillustrates the use of the Hashtable methods
7.Demonstrate HashtableDemonstrate Hashtable
8.Get IDictionaryEnumerator enumerator from Hashtable
9.DictionaryEntry Structure Defines a dictionary key/value pair that can be set or retrieved.
10.Create Hashtable by copying the elements from the specified dictionary to the new Hashtable object.
11.Hashtable.Clear Method removes all elements from the Hashtable.
12.Hashtable.Contains Method determines whether the Hashtable contains a specific key.
13.Hashtable.CopyTo Method copies the Hashtable elements to a one-dimensional Array instance at the specified index.
14.Hashtable.GetEnumerator Method returns an IDictionaryEnumerator that iterates through the Hashtable.
15.Hashtable.IsSynchronized Property gets a value indicating whether access to the Hashtable is synchronized (thread safe).
16.Hashtable.Remove Method removes the element with the specified key from the Hashtable.
17.IComparer Interface exposes a method that compares two objects.