Advertisement
Guest User

Parser (JSON Reader)

a guest
Apr 8th, 2014
268
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.12 KB | None | 0 0
  1. #include "Header.h"
  2. #include "amxxmodule.h"
  3.  
  4. static std::vector <Json::Reader *> g_readerHandlePtr;
  5. static std::vector <Json::Value *> g_rootHandlePtr;
  6.  
  7. static int g_forwardIndex;
  8.  
  9. CCStrPtr readFile(CCStrPtr fileNamePtr)
  10. {
  11.     static FILE * fileHandlePtr;
  12.     static std::string fileContent;
  13.     static int fileCharacter;
  14.  
  15.     fileHandlePtr = fopen(fileNamePtr, "rb");
  16.  
  17.     fileContent.assign("");
  18.  
  19.     if (fileHandlePtr)
  20.     {
  21.         do
  22.         {
  23.             fileContent += (fileCharacter = fgetc(fileHandlePtr));
  24.         }
  25.  
  26.         while (fileCharacter != EOF);
  27.  
  28.         fclose(fileHandlePtr);
  29.     }
  30.  
  31.     return fileContent.c_str();
  32. }
  33.  
  34. static cell AMX_NATIVE_CALL parserLoadFile(AMX * amxHandlePtr, cell * parameterHandlePtr)
  35. {
  36.     static CCStrPtr fileNamePtr, fileContentPtr;
  37.     static Json::Reader * readerHandlePtr;
  38.     static Json::Value * rootHandlePtr;
  39.  
  40.     fileNamePtr = MF_GetAmxString(amxHandlePtr, parameterHandlePtr[1u], 0u, NULL);
  41.  
  42.     fileContentPtr = readFile(fileNamePtr);
  43.  
  44.     if (!fileContentPtr[0u])
  45.     {
  46.         MF_LogError(amxHandlePtr, AMX_ERR_NATIVE, "Can't get data from %s file!", fileNamePtr);
  47.  
  48.         return 0u;
  49.     }
  50.  
  51.     readerHandlePtr = new Json::Reader;
  52.     rootHandlePtr = new Json::Value;
  53.  
  54.     readerHandlePtr->parse(fileContentPtr, *rootHandlePtr);
  55.  
  56.     g_readerHandlePtr.push_back(readerHandlePtr);
  57.     g_rootHandlePtr.push_back(rootHandlePtr);
  58.  
  59.     return g_readerHandlePtr.size();
  60. }
  61.  
  62. static cell AMX_NATIVE_CALL parserGetString(AMX * amxHandlePtr, cell * parameterHandlePtr)
  63. {
  64.     static int fileIndex, bufferSize;
  65.     static CCStrPtr keyNamePtr;
  66.     static Json::Value * rootHandlePtr;
  67.  
  68.     bufferSize = parameterHandlePtr[4u];
  69.     fileIndex = parameterHandlePtr[1u];
  70.  
  71.     keyNamePtr = MF_GetAmxString(amxHandlePtr, parameterHandlePtr[2u], 0u, NULL);
  72.  
  73.     rootHandlePtr = g_rootHandlePtr.at(fileIndex - 1u);
  74.  
  75.     MF_SetAmxString(amxHandlePtr, parameterHandlePtr[3u], rootHandlePtr->get(keyNamePtr, "").asString().c_str(), bufferSize);
  76.  
  77.     return 1u;
  78. }
  79.  
  80. static cell AMX_NATIVE_CALL parserGetFloat(AMX * amxHandlePtr, cell * parameterHandlePtr)
  81. {
  82.     static int fileIndex;
  83.     static CCStrPtr keyNamePtr;
  84.     static Json::Value * rootHandlePtr;
  85.  
  86.     fileIndex = parameterHandlePtr[1u];
  87.  
  88.     keyNamePtr = MF_GetAmxString(amxHandlePtr, parameterHandlePtr[2u], 0u, NULL);
  89.  
  90.     rootHandlePtr = g_rootHandlePtr.at(fileIndex - 1u);
  91.  
  92.     return amx_ftoc(rootHandlePtr->get(keyNamePtr, 0.0f).asFloat());
  93. }
  94.  
  95. static cell AMX_NATIVE_CALL parserGetInt(AMX * amxHandlePtr, cell * parameterHandlePtr)
  96. {
  97.     static int fileIndex;
  98.     static CCStrPtr keyNamePtr;
  99.     static Json::Value * rootHandlePtr;
  100.  
  101.     fileIndex = parameterHandlePtr[1u];
  102.  
  103.     keyNamePtr = MF_GetAmxString(amxHandlePtr, parameterHandlePtr[2u], 0u, NULL);
  104.  
  105.     rootHandlePtr = g_rootHandlePtr.at(fileIndex - 1u);
  106.  
  107.     return rootHandlePtr->get(keyNamePtr, 0u).asInt();
  108. }
  109.  
  110. static cell AMX_NATIVE_CALL parserEnumData(AMX * amxHandlePtr, cell * parameterHandlePtr)
  111. {
  112.     static int fileIndex, iteratorVar;
  113.     static CCStrPtr keyNamePtr;
  114.     static Json::Value * rootHandlePtr;
  115.  
  116.     fileIndex = parameterHandlePtr[1u];
  117.  
  118.     keyNamePtr = MF_GetAmxString(amxHandlePtr, parameterHandlePtr[2u], 0u, NULL);
  119.  
  120.     rootHandlePtr = g_rootHandlePtr.at(fileIndex - 1u);
  121.  
  122.     for (iteratorVar = 0u; iteratorVar < (*rootHandlePtr)[keyNamePtr].size(); iteratorVar++)
  123.     {
  124.         MF_ExecuteForward(g_forwardIndex, static_cast <cell> (fileIndex), static_cast <CCStrPtr> (keyNamePtr), \
  125.             static_cast <CCStrPtr> ((*rootHandlePtr)[keyNamePtr][iteratorVar].asCString()));
  126.     }
  127.  
  128.     return 1u;
  129. }
  130.  
  131. static const AMX_NATIVE_INFO g_parserFunctions[] =
  132. {
  133.     { "parserLoadFile", parserLoadFile },
  134.  
  135.     { "parserGetString", parserGetString },
  136.     { "parserGetFloat", parserGetFloat },
  137.     { "parserGetInt", parserGetInt },
  138.  
  139.     { "parserEnumData", parserEnumData },
  140.  
  141.     { NULL, NULL }
  142. };
  143.  
  144. void OnAmxxAttach(void)
  145. {
  146.     MF_AddNatives(g_parserFunctions);
  147. }
  148.  
  149. void OnAmxxDetach(void)
  150. {
  151.     static int iteratorVar;
  152.  
  153.     for (iteratorVar = 0u; iteratorVar < g_readerHandlePtr.size(); iteratorVar++)
  154.     {
  155.         delete g_readerHandlePtr.at(iteratorVar);
  156.         delete g_rootHandlePtr.at(iteratorVar);
  157.     }
  158. }
  159.  
  160. void OnPluginsLoaded(void)
  161. {
  162.     g_forwardIndex = MF_RegisterForward("parserEnumForward", ET_IGNORE, FP_CELL, FP_STRING, FP_STRING, FP_DONE);
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement