#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[];
extern const int XB_Zar_name_len;
 
//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?
const int XB_Zar_name_len = sizeof(XB_Zar_name)/sizeof(XB_Zar_name[0]);
 
//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 int uni_name_len;
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;
int uni_name_len = 0;
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void setFont(byte fontNumber)
{
    switch (fontNumber)
    {
    case 0:
        char_addr = XB_Zar_addr;
        char_width = XB_Zar_width;
        uni_name = XB_Zar_name;
        uni_name_len = XB_Zar_name_len;
        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; i < uni_name_len; ++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;
}
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKI2RlZmluZSBQUk9HTUVNCgpjbGFzcyBTdHJpbmcKewoJc3RkOjpzdHJpbmcgZGF0YTsKCnB1YmxpYzoKCVN0cmluZygpIHt9CglTdHJpbmcoY29uc3QgY2hhciogcykgOiBkYXRhKHMpIHt9CglTdHJpbmcoY29uc3QgU3RyaW5nICZzKSA6IGRhdGEocy5kYXRhKSB7fQoJU3RyaW5nKGludCB2YWwpIDogZGF0YShzdGQ6OnRvX3N0cmluZyh2YWwpKSB7fQoKCWludCBMZW5ndGgoKSBjb25zdCB7IHJldHVybiBkYXRhLnNpemUoKTsgfQoKICAgIGZyaWVuZCBTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IFN0cmluZyAmbGhzLCBjb25zdCBTdHJpbmcgJnJocykgewogICAgCVN0cmluZyByZXM7CiAgICAJcmVzLmRhdGEgPSBsaHMuZGF0YSArIHJocy5kYXRhOwogICAgCXJldHVybiByZXM7CiAgICB9CgogICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJm91dCwgY29uc3QgU3RyaW5nICZyaHMpIHsKICAgIAlyZXR1cm4gb3V0IDw8IHJocy5kYXRhOwogICAgfQoKICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTdHJpbmcgJnJocykgY29uc3QgewogICAgCXJldHVybiBkYXRhID09IHJocy5kYXRhOwogICAgfQp9OwoKc3RydWN0IHNTZXJpYWwKewoJdm9pZCBwcmludGxuKGNvbnN0IFN0cmluZyAmcykgeyBzdGQ6OmNvdXQgPDwgcyA8PCBzdGQ6OmVuZGw7IH0KfTsKc1NlcmlhbCBTZXJpYWw7Cgp0eXBlZGVmIHVuc2lnbmVkIGNoYXIgYnl0ZTsKCi8vIHphci5oCgovKnYqL2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFhCX1phcl8xMThbXTsKLyp3Ki9leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYQl9aYXJfMTE5W107Ci8qeCovZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWEJfWmFyXzEyMFtdOwovKnkqL2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFhCX1phcl8xMjFbXTsKLyp6Ki9leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYQl9aYXJfMTIyW107CmV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgWEJfWmFyX3dpZHRoW107CmV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyKiBYQl9aYXJfYWRkcltdOwpleHRlcm4gY29uc3QgU3RyaW5nIFhCX1phcl9uYW1lW107CmV4dGVybiBjb25zdCBpbnQgWEJfWmFyX25hbWVfbGVuOwoKLy96YXIuY3BwCgovKnYqLyBjb25zdCB1bnNpZ25lZCBjaGFyIFhCX1phcl8xMThbXSBQUk9HTUVNID17MjU1LDI1NSwyNTQsMjU1LDYzLDI1NX07Ci8qdyovIGNvbnN0IHVuc2lnbmVkIGNoYXIgWEJfWmFyXzExOVtdIFBST0dNRU0gPXsyNTUsMTI3LDI1NSwyNTQsMjU1LDV9OwovKngqLyBjb25zdCB1bnNpZ25lZCBjaGFyIFhCX1phcl8xMjBbXSBQUk9HTUVNID17MjE1LDIxNSwyMywyNTQsMjU1LDEyN307Ci8qeSovIGNvbnN0IHVuc2lnbmVkIGNoYXIgWEJfWmFyXzEyMVtdIFBST0dNRU0gPXsyNTUsMTI3LDI1LDI1NCwyNTUsOX07Ci8qeiovIGNvbnN0IHVuc2lnbmVkIGNoYXIgWEJfWmFyXzEyMltdIFBST0dNRU0gPXsyNTUsMjQzLDIzOSwyNTQsMjE1LDE5fTsKY29uc3QgdW5zaWduZWQgaW50IFhCX1phcl93aWR0aFtdID0gezIsIDIsIDIsIDIsIDIsIDB9OyAvLyBUT0RPOiBmaXggdGhlIDZ0aCBlbGVtZW50IQpjb25zdCB1bnNpZ25lZCBjaGFyKiBYQl9aYXJfYWRkcltdID0ge1hCX1phcl8xMTgsIFhCX1phcl8xMTksIFhCX1phcl8xMjAsIFhCX1phcl8xMjEsIFhCX1phcl8xMjIsIE5VTEx9OyAvLyBUT0RPOiBmaXggdGhlIDZ0aCBlbGVtZW50IQpjb25zdCBTdHJpbmcgWEJfWmFyX25hbWVbXSA9IHsi27AiLCAi27EiLCAi27IiLCAi27MiLCAi27QiLCAi27UifTsgLy8gVE9ETzogcmVtb3ZlIHRoZSA2dGggZWxlbWVudD8KY29uc3QgaW50IFhCX1phcl9uYW1lX2xlbiA9IHNpemVvZihYQl9aYXJfbmFtZSkvc2l6ZW9mKFhCX1phcl9uYW1lWzBdKTsKCi8vZm9udC5oCgovLyNwcmFnbWEgb25jZQovLyNpbmNsdWRlICJ6YXIuaCIKZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipjaGFyX2FkZHI7CmV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgKmNoYXJfd2lkdGg7CmV4dGVybiBjb25zdCBTdHJpbmcgKnVuaV9uYW1lOwpleHRlcm4gaW50IHVuaV9uYW1lX2xlbjsKZXh0ZXJuIHZvaWQgc2V0Rm9udChieXRlIGZvbnROdW1iZXIpOwpleHRlcm4gaW50IGdldEdsaXBoRGF0YShjb25zdCBTdHJpbmcgJnVuaUNoYXIsIGludCAqaW5kZXgsIGludCAqd2lkdGgpOwoKLy9mb250LmNwcAoKLy8jaW5jbHVkZSAiZm9udC5oIgoKCmNvbnN0IHVuc2lnbmVkIGNoYXIgKipjaGFyX2FkZHIgPSBOVUxMOwpjb25zdCB1bnNpZ25lZCBpbnQgKmNoYXJfd2lkdGggPSBOVUxMOwpjb25zdCBTdHJpbmcgKnVuaV9uYW1lID0gTlVMTDsKaW50IHVuaV9uYW1lX2xlbiA9IDA7Ci8vQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAKdm9pZCBzZXRGb250KGJ5dGUgZm9udE51bWJlcikKewogICAgc3dpdGNoIChmb250TnVtYmVyKQogICAgewogICAgY2FzZSAwOgogICAgICAgIGNoYXJfYWRkciA9IFhCX1phcl9hZGRyOwogICAgICAgIGNoYXJfd2lkdGggPSBYQl9aYXJfd2lkdGg7CiAgICAgICAgdW5pX25hbWUgPSBYQl9aYXJfbmFtZTsKICAgICAgICB1bmlfbmFtZV9sZW4gPSBYQl9aYXJfbmFtZV9sZW47CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICBjaGFyX2FkZHIgPSBYQl9aYXJfYWRkcjsKICAgICAgICBjaGFyX3dpZHRoID0gWEJfWmFyX3dpZHRoOwogICAgICAgIGJyZWFrOwogICAgfQp9Ci8vQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAKaW50IGdldEdsaXBoRGF0YShjb25zdCBTdHJpbmcgJnVuaUNoYXIsIGludCogaW5kZXgsIGludCogY2hhcldpZHRoKQp7CiAgICBTZXJpYWwucHJpbnRsbigidW5pQ2hhciBkYXRhPSAiICsgdW5pQ2hhcik7CiAgICBpZiAodW5pX25hbWUpCiAgICB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmlfbmFtZV9sZW47ICsraSkKICAgICAgICB7ICAKICAgICAgICAgICAgU2VyaWFsLnByaW50bG4oInVuaV9uYW1lWyIgKyBTdHJpbmcoaSkgKyAiXT0gIiArIHVuaV9uYW1lW2ldKTsKICAgICAgICAgICAgaWYgKHVuaUNoYXIgPT0gdW5pX25hbWVbaV0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICppbmRleCA9IGk7CiAgICAgICAgICAgICAgICAqY2hhcldpZHRoID0gY2hhcl93aWR0aFtpXTsKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIC0xOwp9CgoKaW50IG1haW4oKQp7CglzZXRGb250KDApOwoKCWludCBpbmRleDsKCWludCBjaGFyV2lkdGg7CglpbnQgcmVzID0gZ2V0R2xpcGhEYXRhKCLbsiIsICZpbmRleCwgJmNoYXJXaWR0aCk7CgkKCXN0ZDo6Y291dCA8PCAiZ2V0R2xpcGhEYXRhID0gIiA8PCByZXMgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICJpbmRleCA9ICIgPDwgaW5kZXggPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICJjaGFyV2lkdGggPSAiIDw8IGNoYXJXaWR0aCA8PCBzdGQ6OmVuZGw7CgoJcmV0dXJuIDA7Cn0=