// 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

#include "barcode.h"
FX_BOOL BC_FX_ByteString_Replace(CFX_ByteString &dst, FX_DWORD first, FX_DWORD last, int32_t count, FX_CHAR c)
{
    if (first > last || count <= 0) {
        return FALSE;
    }
    dst.Delete(first, last - first);
    for (int32_t i = 0; i < count; i ++) {
        dst.Insert(0, c);
    }
    return TRUE;
}
void BC_FX_ByteString_Append(CFX_ByteString &dst, int32_t count, FX_CHAR c)
{
    for (int32_t i = 0; i < count; i ++) {
        dst += c;
    }
}
void BC_FX_ByteString_Append(CFX_ByteString &dst, const CFX_ByteArray &ba)
{
    for (int32_t i = 0; i < ba.GetSize(); i ++) {
        dst += ba[i];
    }
}
void BC_FX_PtrArray_Sort(CFX_PtrArray &src, BC_PtrArrayCompareCallback fun)
{
    int32_t nLength = src.GetSize();
    FX_BOOL changed = true;
    do {
        changed = false;
        for (int32_t i = 0; i < nLength - 1; i++) {
            if ( fun(src[i + 1], src[i]) ) {
                void *temp = src[i];
                src.SetAt(i, src[i + 1]);
                src.SetAt(i + 1, temp);
                changed = true;
            }
        }
    } while (changed);
}
