/*
**
** Copyright 2011, The Android Open Source Project
**
** 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.
*/

#ifndef LATINIME_DEBUG_H
#define LATINIME_DEBUG_H

#include "defines.h"

static inline unsigned char* convertToUnibyteString(unsigned short* input, unsigned char* output,
        const unsigned int length) {
    int i = 0;
    for (; i <= length && input[i] != 0; ++i)
        output[i] = input[i] & 0xFF;
    output[i] = 0;
    return output;
}

static inline unsigned char* convertToUnibyteStringAndReplaceLastChar(unsigned short* input,
        unsigned char* output, const unsigned int length, unsigned char c) {
    int i = 0;
    for (; i <= length && input[i] != 0; ++i)
        output[i] = input[i] & 0xFF;
    output[i-1] = c;
    output[i] = 0;
    return output;
}

static inline void LOGI_S16(unsigned short* string, const unsigned int length) {
    unsigned char tmp_buffer[length];
    convertToUnibyteString(string, tmp_buffer, length);
    AKLOGI(">> %s", tmp_buffer);
    // The log facility is throwing out log that comes too fast. The following
    // is a dirty way of slowing down processing so that we can see all log.
    // TODO : refactor this in a blocking log or something.
    // usleep(10);
}

static inline void LOGI_S16_PLUS(unsigned short* string, const unsigned int length,
        unsigned char c) {
    unsigned char tmp_buffer[length+1];
    convertToUnibyteStringAndReplaceLastChar(string, tmp_buffer, length, c);
    AKLOGI(">> %s", tmp_buffer);
    // Likewise
    // usleep(10);
}

static inline void printDebug(const char* tag, int* codes, int codesSize, int MAX_PROXIMITY_CHARS) {
    unsigned char *buf = (unsigned char*)malloc((1 + codesSize) * sizeof(*buf));

    buf[codesSize] = 0;
    while (--codesSize >= 0)
        buf[codesSize] = (unsigned char)codes[codesSize * MAX_PROXIMITY_CHARS];
    AKLOGI("%s, WORD = %s", tag, buf);

    free(buf);
}

#endif // LATINIME_DEBUG_H
