74 lines
1.5 KiB
C
74 lines
1.5 KiB
C
|
/* -*- 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 GreekCasing_h_
|
||
|
#define GreekCasing_h_
|
||
|
|
||
|
#include <stdint.h>
|
||
|
#include "mozilla/Attributes.h"
|
||
|
|
||
|
namespace mozilla {
|
||
|
|
||
|
class GreekCasing {
|
||
|
// When doing an Uppercase transform in Greek, we need to keep track of the
|
||
|
// current state while iterating through the string, to recognize and process
|
||
|
// diphthongs correctly. For clarity, we define a state for each vowel and
|
||
|
// each vowel with accent, although a few of these do not actually need any
|
||
|
// special treatment and could be folded into kStart.
|
||
|
private:
|
||
|
enum GreekStates {
|
||
|
kStart,
|
||
|
kAlpha,
|
||
|
kEpsilon,
|
||
|
kEta,
|
||
|
kIota,
|
||
|
kOmicron,
|
||
|
kUpsilon,
|
||
|
kOmega,
|
||
|
kAlphaAcc,
|
||
|
kEpsilonAcc,
|
||
|
kEtaAcc,
|
||
|
kIotaAcc,
|
||
|
kOmicronAcc,
|
||
|
kUpsilonAcc,
|
||
|
kOmegaAcc,
|
||
|
kOmicronUpsilon,
|
||
|
kDiaeresis
|
||
|
};
|
||
|
|
||
|
public:
|
||
|
class State {
|
||
|
public:
|
||
|
State()
|
||
|
: mState(kStart)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
MOZ_IMPLICIT State(const GreekStates& aState)
|
||
|
: mState(aState)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void Reset()
|
||
|
{
|
||
|
mState = kStart;
|
||
|
}
|
||
|
|
||
|
operator GreekStates() const
|
||
|
{
|
||
|
return mState;
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
GreekStates mState;
|
||
|
};
|
||
|
|
||
|
static uint32_t UpperCase(uint32_t aCh, State& aState);
|
||
|
};
|
||
|
|
||
|
} // namespace mozilla
|
||
|
|
||
|
#endif
|