File indexing completed on 2024-12-22 04:33:41
0001 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 0002 /* ***** BEGIN LICENSE BLOCK ***** 0003 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 0004 * 0005 * The contents of this file are subject to the Mozilla Public License Version 0006 * 1.1 (the "License"); you may not use this file except in compliance with 0007 * the License. You may obtain a copy of the License at 0008 * http://www.mozilla.org/MPL/ 0009 * 0010 * Software distributed under the License is distributed on an "AS IS" basis, 0011 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 0012 * for the specific language governing rights and limitations under the 0013 * License. 0014 * 0015 * The Original Code is mozilla.org code. 0016 * 0017 * The Initial Developer of the Original Code is 0018 * Netscape Communications Corporation. 0019 * Portions created by the Initial Developer are Copyright (C) 1998 0020 * the Initial Developer. All Rights Reserved. 0021 * 0022 * Contributor(s): 0023 * 0024 * Alternatively, the contents of this file may be used under the terms of 0025 * either the GNU General Public License Version 2 or later (the "GPL"), or 0026 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 0027 * in which case the provisions of the GPL or the LGPL are applicable instead 0028 * of those above. If you wish to allow use of your version of this file only 0029 * under the terms of either the GPL or the LGPL, and not to allow others to 0030 * use your version of this file under the terms of the MPL, indicate your 0031 * decision by deleting the provisions above and replace them with the notice 0032 * and other provisions required by the GPL or the LGPL. If you do not delete 0033 * the provisions above, a recipient may use your version of this file under 0034 * the terms of any one of the MPL, the GPL or the LGPL. 0035 * 0036 * ***** END LICENSE BLOCK ***** */ 0037 #ifndef nsCodingStateMachine_h__ 0038 #define nsCodingStateMachine_h__ 0039 0040 #include "nsPkgInt.h" 0041 0042 typedef enum { 0043 eStart = 0, 0044 eError = 1, 0045 eItsMe = 2 0046 } nsSMState; 0047 0048 #define GETCLASS(c) GETFROMPCK(((unsigned char)(c)), mModel->classTable) 0049 0050 //state machine model 0051 typedef struct 0052 { 0053 nsPkgInt classTable; 0054 PRUint32 classFactor; 0055 nsPkgInt stateTable; 0056 const PRUint32* charLenTable; 0057 const char* name; 0058 } SMModel; 0059 0060 class nsCodingStateMachine { 0061 public: 0062 nsCodingStateMachine(SMModel* sm){ 0063 mCurrentState = eStart; 0064 mCurrentCharLen = 0; 0065 mCurrentBytePos = 0; 0066 mModel = sm; 0067 }; 0068 nsSMState NextState(char c){ 0069 //for each byte we get its class , if it is first byte, we also get byte length 0070 PRUint32 byteCls = GETCLASS(c); 0071 if (mCurrentState == eStart) 0072 { 0073 mCurrentBytePos = 0; 0074 mCurrentCharLen = mModel->charLenTable[byteCls]; 0075 } 0076 //from byte's class and stateTable, we get its next state 0077 mCurrentState=(nsSMState)GETFROMPCK(mCurrentState*(mModel->classFactor)+byteCls, 0078 mModel->stateTable); 0079 mCurrentBytePos++; 0080 return mCurrentState; 0081 }; 0082 PRUint32 GetCurrentCharLen(void) {return mCurrentCharLen;}; 0083 void Reset(void) {mCurrentState = eStart;}; 0084 const char * GetCodingStateMachine() {return mModel->name;}; 0085 0086 protected: 0087 nsSMState mCurrentState; 0088 PRUint32 mCurrentCharLen; 0089 PRUint32 mCurrentBytePos; 0090 0091 SMModel *mModel; 0092 }; 0093 0094 extern SMModel UTF8SMModel; 0095 extern SMModel Big5SMModel; 0096 extern SMModel EUCJPSMModel; 0097 extern SMModel EUCKRSMModel; 0098 extern SMModel EUCTWSMModel; 0099 extern SMModel GB18030SMModel; 0100 extern SMModel SJISSMModel; 0101 extern SMModel UCS2BESMModel; 0102 0103 0104 extern SMModel HZSMModel; 0105 extern SMModel ISO2022CNSMModel; 0106 extern SMModel ISO2022JPSMModel; 0107 extern SMModel ISO2022KRSMModel; 0108 0109 #endif /* nsCodingStateMachine_h__ */ 0110