#include "stdafx.h"
#include <windows.h>
#include <wchar.h>
#include "kbnsfplug_nsfconfig.h"

//////////////////////////////////////////////////////////////////////////
NSFPlayerConfigMem::NSFPlayerConfigMem() : xgm::NSFPlayerConfigIni()
{
}
//////////////////////////////////////////////////////////////////////////
NSFPlayerConfigMem::~NSFPlayerConfigMem()
{
}
//////////////////////////////////////////////////////////////////////////
void NSFPlayerConfigMem::LoadFromMem (const char *cszMem)
{//メモリから設定を読み込み
    const char* p = cszMem;
    const char* key;
    const char* val;
    const char* val_end;
    char szKey[128];//128バイトあれば十分
    char szVal[128];//128バイトあれば十分
    while(p[0]){
        key = p;
        val = strchr(key, '=');
        if(!val)break;
        val++;
        val_end = strstr(val, "\r\n");
        if(!val_end)break;

        int key_len = val - key - 1;//'=' の分だけ減算
        int val_len = val_end - val;
        if(key_len >= sizeof(szKey))break;
        if(val_len >= sizeof(szVal))break;
        memcpy(szKey, key, key_len);
        szKey[key_len] = 0;
        memcpy(szVal, val, val_len);
        szVal[val_len] = 0;
        data[szKey] = szVal;
        p = val_end + 2;
    }
}
//////////////////////////////////////////////////////////////////////////
void NSFPlayerConfigMem::SaveToMem(char** ppszMem)
{//設定をメモリに保存
 //ファイルには書き込まず、ユーザーからは見えないので内部形式みたいなものでOK
 //key1=val1\r\n
 //key2=val2\r\n
 //...
 //keyN=valN\r\n
 //となるような文字列とする(0 で終わる) 
 //セクション名は不要
    int size = 1;
    char *mem = strdup("");
    std::map<std::string, vcm::Value>::iterator it;
    for(it=data.begin(); it!=data.end(); it++){
        const char* name = it->first.c_str();
        size += strlen(name);//キー名
        size++;//+=strlen("=")
        size += strlen(data[name]);//値
        size += 2;//+=strlen("\r\n")
        mem = (char*)realloc(mem, size);
        strncat_s(mem, size, name, _TRUNCATE);
        strncat_s(mem, size, "=", _TRUNCATE);
        strncat_s(mem, size, data[name], _TRUNCATE);
        strncat_s(mem, size, "\r\n", _TRUNCATE);
    }
    *ppszMem = mem;
}

