// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
// Original code is licensed as follows:
/*
 * Copyright 2006-2007 Jeremias Maerki.
 *
 * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "../barcode.h"
#include "../common/BC_CommonBitMatrix.h"
#include "../BC_Dimension.h"
#include "BC_Encoder.h"
#include "BC_SymbolShapeHint.h"
#include "BC_SymbolInfo.h"
#include "BC_EncoderContext.h"
#include "BC_HighLevelEncoder.h"
#include "BC_C40Encoder.h"
#include "BC_TextEncoder.h"
CBC_TextEncoder::CBC_TextEncoder()
{
}
CBC_TextEncoder::~CBC_TextEncoder()
{
}
FX_INT32 CBC_TextEncoder::getEncodingMode()
{
    return TEXT_ENCODATION;
}
FX_INT32 CBC_TextEncoder::encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e)
{
    if (c == ' ') {
        sb += (FX_WCHAR)'\3';
        return 1;
    }
    if (c >= '0' && c <= '9') {
        sb += (FX_WCHAR) (c - 48 + 4);
        return 1;
    }
    if (c >= 'a' && c <= 'z') {
        sb += (FX_WCHAR) (c - 97 + 14);
        return 1;
    }
    if (c >= '\0' && c <= 0x1f) {
        sb += (FX_WCHAR)'\0';
        sb += c;
        return 2;
    }
    if (c >= '!' && c <= '/') {
        sb += (FX_WCHAR) '\1';
        sb += (FX_WCHAR) (c - 33);
        return 2;
    }
    if (c >= ':' && c <= '@') {
        sb += (FX_WCHAR)'\1';
        sb += (FX_WCHAR) (c - 58 + 15);
        return 2;
    }
    if (c >= '[' && c <= '_') {
        sb += (FX_WCHAR) '\1';
        sb += (FX_WCHAR) (c - 91 + 22);
        return 2;
    }
    if (c == 0x0060) {
        sb += (FX_WCHAR) '\2';
        sb += (FX_WCHAR) (c - 96);
        return 2;
    }
    if (c >= 'A' && c <= 'Z') {
        sb += (FX_WCHAR)'\2';
        sb += (FX_WCHAR) (c - 65 + 1);
        return 2;
    }
    if (c >= '{' && c <= 0x007f) {
        sb += (FX_WCHAR)'\2';
        sb += (FX_WCHAR) (c - 123 + 27);
        return 2;
    }
    if (c >= 0x0080) {
        sb += (FX_WCHAR)'\1';
        sb += (FX_WCHAR)0x001e;
        FX_INT32 len = 2;
        len += encodeChar((FX_WCHAR) (c - 128), sb, e);
        BC_EXCEPTION_CHECK_ReturnValue(e, -1);
        return len;
    }
    CBC_HighLevelEncoder::illegalCharacter(c, e);
    return -1;
}
