Back to index

lightning-sunbird  0.9+nobinonly
nsManifestLineReader.h
Go to the documentation of this file.
00001 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
00002 /* ***** BEGIN LICENSE BLOCK *****
00003  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
00004  *
00005  * The contents of this file are subject to the Mozilla Public License Version
00006  * 1.1 (the "License"); you may not use this file except in compliance with
00007  * the License. You may obtain a copy of the License at
00008  * http://www.mozilla.org/MPL/
00009  *
00010  * Software distributed under the License is distributed on an "AS IS" basis,
00011  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00012  * for the specific language governing rights and limitations under the
00013  * License.
00014  *
00015  * The Original Code is mozilla.org code.
00016  *
00017  * The Initial Developer of the Original Code is
00018  * Netscape Communications Corporation.
00019  * Portions created by the Initial Developer are Copyright (C) 1998
00020  * the Initial Developer. All Rights Reserved.
00021  *
00022  * Contributor(s):
00023  *
00024  * Alternatively, the contents of this file may be used under the terms of
00025  * either of the GNU General Public License Version 2 or later (the "GPL"),
00026  * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00027  * in which case the provisions of the GPL or the LGPL are applicable instead
00028  * of those above. If you wish to allow use of your version of this file only
00029  * under the terms of either the GPL or the LGPL, and not to allow others to
00030  * use your version of this file under the terms of the MPL, indicate your
00031  * decision by deleting the provisions above and replace them with the notice
00032  * and other provisions required by the GPL or the LGPL. If you do not delete
00033  * the provisions above, a recipient may use your version of this file under
00034  * the terms of any one of the MPL, the GPL or the LGPL.
00035  *
00036  * ***** END LICENSE BLOCK ***** */
00037 
00038 #ifndef nsManifestLineReader_h__
00039 #define nsManifestLineReader_h__
00040 
00041 #include "nspr.h"
00042 #include "nsDebug.h"
00043 
00044 class nsManifestLineReader
00045 {
00046 public:
00047     nsManifestLineReader() : mBase(nsnull) {} 
00048     ~nsManifestLineReader() {}
00049 
00050     void Init(char* base, PRUint32 flen) 
00051     {
00052         mBase = mCur = mNext = base; 
00053         mLength = 0;
00054         mLimit = base + flen;
00055     }
00056 
00057     PRBool NextLine()
00058     {
00059         if(mNext >= mLimit)
00060             return PR_FALSE;
00061         
00062         mCur = mNext;
00063         mLength = 0;
00064         
00065         while(mNext < mLimit)
00066         {
00067             if(IsEOL(*mNext))
00068             {
00069                 *mNext = '\0';
00070                 for(++mNext; mNext < mLimit; ++mNext)
00071                     if(!IsEOL(*mNext))
00072                         break;
00073                 return PR_TRUE;
00074             }
00075             ++mNext;
00076             ++mLength;
00077         }
00078         return PR_FALSE;        
00079     }
00080 
00081     int ParseLine(char** chunks, int* lengths, int maxChunks)
00082     {
00083         NS_ASSERTION(mCur && maxChunks && chunks, "bad call to ParseLine");
00084         int found = 0;
00085         chunks[found++] = mCur;
00086 
00087         if(found < maxChunks)
00088         {
00089             char *lastchunk = mCur;
00090             int *lastlength = lengths;
00091             for(char* cur = mCur; *cur; cur++)
00092             {
00093                 if(*cur == ',')
00094                 {
00095                     *cur = 0;
00096                     // always fill in the previous chunk's length
00097                     *lastlength++ = cur - lastchunk;
00098                     chunks[found++] = lastchunk = cur+1;
00099                     if(found == maxChunks)
00100                         break;
00101                 }
00102             }
00103             // crazy pointer math - calculate the length of the final chunk
00104             *lastlength = (mCur + mLength) - lastchunk;
00105         }
00106         return found;
00107     }
00108 
00109     char*       LinePtr() {return mCur;}    
00110     PRUint32    LineLength() {return mLength;}    
00111 
00112     PRBool      IsEOL(char c) {return c == '\n' || c == '\r';}
00113 private:
00114     char*       mCur;
00115     PRUint32    mLength;
00116     char*       mNext;
00117     char*       mBase;
00118     char*       mLimit;
00119 };
00120 
00121 #endif