#include <iostream>
#include <string>
 
#define PROGMEM
 
class String
{
	std::string data;
 
public:
	String() {}
	String(const char* s) : data(s) {}
	String(const String &s) : data(s.data) {}
	String(int val) : data(std::to_string(val)) {}
 
	int Length() const { return data.size(); }
 
    friend String operator+(const String &lhs, const String &rhs) {
    	String res;
    	res.data = lhs.data + rhs.data;
    	return res;
    }
 
    friend std::ostream& operator<<(std::ostream &out, const String &rhs) {
    	return out << rhs.data;
    }
 
    bool operator==(const String &rhs) const {
    	return data == rhs.data;
    }
};
 
struct sSerial
{
	void println(const String &s) { std::cout << s << std::endl; }
};
sSerial Serial;
 
typedef unsigned char byte;
 
// zar.h
 
/*v*/extern const unsigned char XB_Zar_118[];
/*w*/extern const unsigned char XB_Zar_119[];
/*x*/extern const unsigned char XB_Zar_120[];
/*y*/extern const unsigned char XB_Zar_121[];
/*z*/extern const unsigned char XB_Zar_122[];
extern const unsigned int XB_Zar_width[];
extern const unsigned char* XB_Zar_addr[];
extern const String XB_Zar_name[];
 
//zar.cpp
 
/*v*/ const unsigned char XB_Zar_118[] PROGMEM ={255,255,254,255,63,255};
/*w*/ const unsigned char XB_Zar_119[] PROGMEM ={255,127,255,254,255,5};
/*x*/ const unsigned char XB_Zar_120[] PROGMEM ={215,215,23,254,255,127};
/*y*/ const unsigned char XB_Zar_121[] PROGMEM ={255,127,25,254,255,9};
/*z*/ const unsigned char XB_Zar_122[] PROGMEM ={255,243,239,254,215,19};
const unsigned int XB_Zar_width[] = {2, 2, 2, 2, 2, 0}; // TODO: fix the 6th element!
const unsigned char* XB_Zar_addr[] = {XB_Zar_118, XB_Zar_119, XB_Zar_120, XB_Zar_121, XB_Zar_122, NULL}; // TODO: fix the 6th element!
const String XB_Zar_name[] = {"۰", "۱", "۲", "۳", "۴", "۵", ""}; // TODO: remove the 6th element?
 
//font.h
 
//#pragma once
//#include "zar.h"
extern const unsigned char **char_addr;
extern const unsigned int *char_width;
extern const String *uni_name;
extern void setFont(byte fontNumber);
extern int getGliphData(const String &uniChar, int *index, int *width);
 
//font.cpp
 
//#include "font.h"
 
 
const unsigned char **char_addr = NULL;
const unsigned int *char_width = NULL;
const String *uni_name = NULL;
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void setFont(byte fontNumber)
{
    switch (fontNumber)
    {
    case 0:
        char_addr = XB_Zar_addr;
        char_width = XB_Zar_width;
        uni_name = XB_Zar_name;
        break;
 
    default:
        char_addr = XB_Zar_addr;
        char_width = XB_Zar_width;
        break;
    }
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
int getGliphData(const String &uniChar, int* index, int* charWidth)
{
    Serial.println("uniChar data= " + uniChar);
    if (uni_name)
    {
        for (int i = 0; uni_name[i].Length() > 0; ++i)
        {  
            Serial.println("uni_name[" + String(i) + "]= " + uni_name[i]);
            if (uniChar == uni_name[i])
            {
                *index = i;
                *charWidth = char_width[i];
                return i;
            }
        }
    }
    return -1;
}
 
 
int main()
{
	setFont(0);
 
	int index;
	int charWidth;
	int res = getGliphData("۲", &index, &charWidth);
 
	std::cout << "getGliphData = " << res << std::endl;
	std::cout << "index = " << index << std::endl;
	std::cout << "charWidth = " << charWidth << std::endl;
 
	return 0;
}
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKI2RlZmluZSBQUk9HTUVNCgpjbGFzcyBTdHJpbmcKewoJc3RkOjpzdHJpbmcgZGF0YTsKCnB1YmxpYzoKCVN0cmluZygpIHt9CglTdHJpbmcoY29uc3QgY2hhciogcykgOiBkYXRhKHMpIHt9CglTdHJpbmcoY29uc3QgU3RyaW5nICZzKSA6IGRhdGEocy5kYXRhKSB7fQoJU3RyaW5nKGludCB2YWwpIDogZGF0YShzdGQ6OnRvX3N0cmluZyh2YWwpKSB7fQoKCWludCBMZW5ndGgoKSBjb25zdCB7IHJldHVybiBkYXRhLnNpemUoKTsgfQoKICAgIGZyaWVuZCBTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IFN0cmluZyAmbGhzLCBjb25zdCBTdHJpbmcgJnJocykgewogICAgCVN0cmluZyByZXM7CiAgICAJcmVzLmRhdGEgPSBsaHMuZGF0YSArIHJocy5kYXRhOwogICAgCXJldHVybiByZXM7CiAgICB9CgogICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJm91dCwgY29uc3QgU3RyaW5nICZyaHMpIHsKICAgIAlyZXR1cm4gb3V0IDw8IHJocy5kYXRhOwogICAgfQoKICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTdHJpbmcgJnJocykgY29uc3QgewogICAgCXJldHVybiBkYXRhID09IHJocy5kYXRhOwogICAgfQp9OwoKc3RydWN0IHNTZXJpYWwKewoJdm9pZCBwcmludGxuKGNvbnN0IFN0cmluZyAmcykgeyBzdGQ6OmNvdXQgPDwgcyA8PCBzdGQ6OmVuZGw7IH0KfTsKc1NlcmlhbCBTZXJpYWw7Cgp0eXBlZGVmIHVuc2lnbmVkIGNoYXIgYnl0ZTsKCi8vIHphci5oCgovKnYqL2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFhCX1phcl8xMThbXTsKLyp3Ki9leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYQl9aYXJfMTE5W107Ci8qeCovZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWEJfWmFyXzEyMFtdOwovKnkqL2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFhCX1phcl8xMjFbXTsKLyp6Ki9leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYQl9aYXJfMTIyW107CmV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgWEJfWmFyX3dpZHRoW107CmV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyKiBYQl9aYXJfYWRkcltdOwpleHRlcm4gY29uc3QgU3RyaW5nIFhCX1phcl9uYW1lW107CgovL3phci5jcHAKCi8qdiovIGNvbnN0IHVuc2lnbmVkIGNoYXIgWEJfWmFyXzExOFtdIFBST0dNRU0gPXsyNTUsMjU1LDI1NCwyNTUsNjMsMjU1fTsKLyp3Ki8gY29uc3QgdW5zaWduZWQgY2hhciBYQl9aYXJfMTE5W10gUFJPR01FTSA9ezI1NSwxMjcsMjU1LDI1NCwyNTUsNX07Ci8qeCovIGNvbnN0IHVuc2lnbmVkIGNoYXIgWEJfWmFyXzEyMFtdIFBST0dNRU0gPXsyMTUsMjE1LDIzLDI1NCwyNTUsMTI3fTsKLyp5Ki8gY29uc3QgdW5zaWduZWQgY2hhciBYQl9aYXJfMTIxW10gUFJPR01FTSA9ezI1NSwxMjcsMjUsMjU0LDI1NSw5fTsKLyp6Ki8gY29uc3QgdW5zaWduZWQgY2hhciBYQl9aYXJfMTIyW10gUFJPR01FTSA9ezI1NSwyNDMsMjM5LDI1NCwyMTUsMTl9Owpjb25zdCB1bnNpZ25lZCBpbnQgWEJfWmFyX3dpZHRoW10gPSB7MiwgMiwgMiwgMiwgMiwgMH07IC8vIFRPRE86IGZpeCB0aGUgNnRoIGVsZW1lbnQhCmNvbnN0IHVuc2lnbmVkIGNoYXIqIFhCX1phcl9hZGRyW10gPSB7WEJfWmFyXzExOCwgWEJfWmFyXzExOSwgWEJfWmFyXzEyMCwgWEJfWmFyXzEyMSwgWEJfWmFyXzEyMiwgTlVMTH07IC8vIFRPRE86IGZpeCB0aGUgNnRoIGVsZW1lbnQhCmNvbnN0IFN0cmluZyBYQl9aYXJfbmFtZVtdID0geyLbsCIsICLbsSIsICLbsiIsICLbsyIsICLbtCIsICLbtSIsICIifTsgLy8gVE9ETzogcmVtb3ZlIHRoZSA2dGggZWxlbWVudD8KCi8vZm9udC5oCgovLyNwcmFnbWEgb25jZQovLyNpbmNsdWRlICJ6YXIuaCIKZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipjaGFyX2FkZHI7CmV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgKmNoYXJfd2lkdGg7CmV4dGVybiBjb25zdCBTdHJpbmcgKnVuaV9uYW1lOwpleHRlcm4gdm9pZCBzZXRGb250KGJ5dGUgZm9udE51bWJlcik7CmV4dGVybiBpbnQgZ2V0R2xpcGhEYXRhKGNvbnN0IFN0cmluZyAmdW5pQ2hhciwgaW50ICppbmRleCwgaW50ICp3aWR0aCk7CgovL2ZvbnQuY3BwCgovLyNpbmNsdWRlICJmb250LmgiCgoKY29uc3QgdW5zaWduZWQgY2hhciAqKmNoYXJfYWRkciA9IE5VTEw7CmNvbnN0IHVuc2lnbmVkIGludCAqY2hhcl93aWR0aCA9IE5VTEw7CmNvbnN0IFN0cmluZyAqdW5pX25hbWUgPSBOVUxMOwovL0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACnZvaWQgc2V0Rm9udChieXRlIGZvbnROdW1iZXIpCnsKICAgIHN3aXRjaCAoZm9udE51bWJlcikKICAgIHsKICAgIGNhc2UgMDoKICAgICAgICBjaGFyX2FkZHIgPSBYQl9aYXJfYWRkcjsKICAgICAgICBjaGFyX3dpZHRoID0gWEJfWmFyX3dpZHRoOwogICAgICAgIHVuaV9uYW1lID0gWEJfWmFyX25hbWU7CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICBjaGFyX2FkZHIgPSBYQl9aYXJfYWRkcjsKICAgICAgICBjaGFyX3dpZHRoID0gWEJfWmFyX3dpZHRoOwogICAgICAgIGJyZWFrOwogICAgfQp9Ci8vQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAKaW50IGdldEdsaXBoRGF0YShjb25zdCBTdHJpbmcgJnVuaUNoYXIsIGludCogaW5kZXgsIGludCogY2hhcldpZHRoKQp7CiAgICBTZXJpYWwucHJpbnRsbigidW5pQ2hhciBkYXRhPSAiICsgdW5pQ2hhcik7CiAgICBpZiAodW5pX25hbWUpCiAgICB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IHVuaV9uYW1lW2ldLkxlbmd0aCgpID4gMDsgKytpKQogICAgICAgIHsgIAogICAgICAgICAgICBTZXJpYWwucHJpbnRsbigidW5pX25hbWVbIiArIFN0cmluZyhpKSArICJdPSAiICsgdW5pX25hbWVbaV0pOwogICAgICAgICAgICBpZiAodW5pQ2hhciA9PSB1bmlfbmFtZVtpXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKmluZGV4ID0gaTsKICAgICAgICAgICAgICAgICpjaGFyV2lkdGggPSBjaGFyX3dpZHRoW2ldOwogICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gLTE7Cn0KCgppbnQgbWFpbigpCnsKCXNldEZvbnQoMCk7CgoJaW50IGluZGV4OwoJaW50IGNoYXJXaWR0aDsKCWludCByZXMgPSBnZXRHbGlwaERhdGEoItuyIiwgJmluZGV4LCAmY2hhcldpZHRoKTsKCQoJc3RkOjpjb3V0IDw8ICJnZXRHbGlwaERhdGEgPSAiIDw8IHJlcyA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgImluZGV4ID0gIiA8PCBpbmRleCA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgImNoYXJXaWR0aCA9ICIgPDwgY2hhcldpZHRoIDw8IHN0ZDo6ZW5kbDsKCglyZXR1cm4gMDsKfQ==