2014-06-02 02:17:54 +04:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
|
|
|
|
#ifndef IrishCasing_h_
|
|
|
|
#define IrishCasing_h_
|
|
|
|
|
|
|
|
#include <stdint.h>
|
2014-08-18 17:53:43 +04:00
|
|
|
#include "mozilla/Attributes.h"
|
2014-06-02 02:17:54 +04:00
|
|
|
|
|
|
|
namespace mozilla {
|
|
|
|
|
|
|
|
class IrishCasing {
|
|
|
|
private:
|
|
|
|
enum IrishStates {
|
|
|
|
kState_Start,
|
|
|
|
kState_InWord,
|
|
|
|
kState_b,
|
|
|
|
kState_bh,
|
|
|
|
kState_d,
|
|
|
|
kState_g,
|
|
|
|
kState_h,
|
|
|
|
kState_m,
|
|
|
|
kState_n,
|
|
|
|
kState_nt_,
|
|
|
|
kState_t,
|
|
|
|
kState_ts,
|
|
|
|
kNumStates
|
|
|
|
};
|
|
|
|
|
|
|
|
enum IrishClasses {
|
|
|
|
kClass_b,
|
|
|
|
kClass_B,
|
|
|
|
kClass_cC,
|
|
|
|
kClass_d,
|
|
|
|
kClass_DG,
|
|
|
|
kClass_fF,
|
|
|
|
kClass_g,
|
|
|
|
kClass_h,
|
|
|
|
kClass_lLNrR,
|
|
|
|
kClass_m,
|
|
|
|
kClass_n,
|
|
|
|
kClass_pP,
|
|
|
|
kClass_sS,
|
|
|
|
kClass_t,
|
|
|
|
kClass_T,
|
|
|
|
kClass_vowel,
|
|
|
|
kClass_Vowel,
|
|
|
|
kClass_hyph,
|
|
|
|
kClass_letter,
|
|
|
|
kClass_other,
|
|
|
|
kNumClasses
|
|
|
|
};
|
|
|
|
|
|
|
|
public:
|
|
|
|
class State {
|
|
|
|
friend class IrishCasing;
|
|
|
|
|
|
|
|
public:
|
|
|
|
State() : mState(kState_Start) {}
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2014-08-18 17:53:43 +04:00
|
|
|
MOZ_IMPLICIT State(const IrishStates& aState) : mState(aState) {}
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2014-06-02 02:17:54 +04:00
|
|
|
void Reset() { mState = kState_Start; }
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2014-06-02 02:17:54 +04:00
|
|
|
operator IrishStates() const { return mState; }
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2014-06-02 02:17:54 +04:00
|
|
|
private:
|
2014-08-18 17:53:43 +04:00
|
|
|
explicit State(uint8_t aState) : mState(IrishStates(aState)) {}
|
2014-06-02 02:17:54 +04:00
|
|
|
|
|
|
|
uint8_t GetClass(uint32_t aCh);
|
|
|
|
|
|
|
|
IrishStates mState;
|
|
|
|
};
|
|
|
|
|
|
|
|
enum {
|
|
|
|
kMarkPositionFlag = 0x80,
|
|
|
|
kActionMask = 0x30,
|
|
|
|
kActionShift = 4,
|
|
|
|
kNextStateMask = 0x0f
|
|
|
|
};
|
|
|
|
|
|
|
|
static const uint8_t sUppercaseStateTable[kNumClasses][kNumStates];
|
|
|
|
static const uint8_t sLcClasses[26];
|
|
|
|
static const uint8_t sUcClasses[26];
|
|
|
|
|
|
|
|
static uint32_t UpperCase(uint32_t aCh, State& aState, bool& aMarkPos,
|
|
|
|
uint8_t& aAction);
|
2014-06-02 15:48:01 +04:00
|
|
|
|
|
|
|
static bool IsUpperVowel(uint32_t aCh) {
|
|
|
|
return GetClass(aCh) == kClass_Vowel;
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
static uint8_t GetClass(uint32_t aCh);
|
2014-06-02 02:17:54 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace mozilla
|
|
|
|
|
|
|
|
#endif
|