ObjectScript API, C ++ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдгред рднрд╛рдЧ 3: C ++ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛

ObjectScript рдПрдХ рдирдпрд╛ рдУрдкрди рд╕реЛрд░реНрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ рд╣реИред ObjectScript рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рд▓реБрдЖ рдФрд░ PHP рдЬреИрд╕реА рднрд╛рд╖рд╛рдУрдВ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред

рднрд╛рдЧ 3: C ++ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛


рдЖрдЗрдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдПрдВ рдЬреЛ рдУрдПрд╕ рдХреЛрдб рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред рд╣рдо рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ рджреЛ рдХрд╛рд░реНрдп:


рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ C ++ рдореЗрдВ рд╣рдорд╛рд░реЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдкрд╣рд▓рд╛ рд╣реИ my_isdigit :

 static int my_isdigit(OS * os, int params, int, int, void*) { OS::String str = os->toString(-params); int len = str.getLen(); for(int i = 0; i < len; i++){ if(!isdigit(str[i])){ os->pushBool(false); return 1; } } os->pushBool(len > 0); return 1; } 

рдмрд┐рд▓ рдкрд░ рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг:

 OS::String str = os->toString(-params); 

рдпрд╣рд╛рдВ рд╣рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдорд┐рд▓рддрд╛ рд╣реИред params рдХрдИ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдЬреЛ OS рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЧрдП рдереЗред -params рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рд╕реНрдЯреИрдХ рдкрд░ рд╕рд╛рдкреЗрдХреНрд╖ рд╕реВрдЪрдХ рд╣реИред рдпрджрд┐ рд╣рдореЗрдВ рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдУрд░ рдореБрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛: os->toString(-params+1) , рддреАрд╕рд░реЗ рдХреЛ - os->toString(-params+2) , рдЖрджрд┐ред

C ++ API рд╕реНрдЯреИрдХ рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рд╕рд░рд▓ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ: toFloat, toDouble, toInt, toString, toUserdata, popFloat , рдЖрджрд┐ред

рдХрднреА-рдХрднреА рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реНрдЯреИрдХ рдХрд╛ рдХрд╛рдо C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд╛рдкреЗрдХреНрд╖ рдСрдлрд╝рд╕реЗрдЯреНрд╕ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рди рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП (рдЪреВрдВрдХрд┐ рд╡реЗ рдХреБрдЫ рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдпрд╛ рд╕реНрдЯреИрдХ рд╕реЗ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдкрд░ рдмрджрд▓ рдЬрд╛рдПрдВрдЧреЗ), рд╕реНрдЯреИрдХ рдкрд░ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░рдкреЗрдХреНрд╖ рд╕реВрдЪрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЗрд╕реЗ getAbsoluteOffs(int offs) рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░реЗрдВ:

 int params_offs = os->getAbsoluteOffs(-params); OS::String str = os->toString(params_offs); //   OS::String str = os->toString(params_offs+1); //  

рдпрд╣ рдПрдХ рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдерд╛, рдЕрдм рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рджреВрд╕рд░рд╛ рдХрд╛рд░реНрдп my_hash :

 static int my_hash(OS * os, int params, int, int, void*) { OS::String str = os->toString(-params); int i, len = str.getLen(), hash = 5381; for(i = 0; i < len; i++){ hash = ((hash << 5) + hash) + str[i]; } hash &= 0x7fffffff; char buf[16]; for(i = 0; hash > 0; hash >>= 4){ buf[i++] = "0123456789abcdef"[hash & 0xf]; } buf[i] = 0; os->pushString(buf); return 1; } 

рдмрд┐рд▓ рдкрд░ рдПрдХ рдЫреЛрдЯреА рд╕реА рд╡реНрдпрд╛рдЦреНрдпрд╛:

  return 1; 

рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рддреИрдпрд╛рд░ рд╣реИрдВ, рдЕрдм рд╣рдореЗрдВ рдУрдПрд╕ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдореЙрдбреНрдпреВрд▓ рд╣реИ:

 void initMyModule(OS * os) { OS::FuncDef funcs[] = { {"isdigit", my_isdigit}, {"hash", my_hash}, {} }; os->getModule("my"); os->setFuncs(funcs); os->pop(); } 

рдЕрдм рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдУрдПрд╕ (main.os) рдкрд░ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦреЗрдВ, рдЬреЛ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рдХреЗ рд▓рд┐рдП C ++ рдореЗрдВ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛:

 for(var i, s in ["123", "12w", 1234, " df", " "]){ print("my.isdigit("..s..") = "my.isdigit(s)" my.hash("..s..") = "my.hash(s)) } 

рдХрд╛рд░реНрдпрдХреНрд░рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛:

 my.isdigit(123) = true my.hash(123) = bf9878b my.isdigit(12w) = false my.hash(12w) = f3a878b my.isdigit(1234) = true my.hash(1234) = f89c87c7 my.isdigit( df) = false my.hash( df) = f48478b my.isdigit( ) = false my.hash( ) = 5082f6c7 

C ++ рдореЗрдВ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб:

 #include "objectscript.h" #include <ctype.h> using namespace ObjectScript; static int my_isdigit(OS * os, int params, int, int, void*) { OS::String str = os->toString(-params); int len = str.getLen(); for(int i = 0; i < len; i++){ if(!isdigit(str[i])){ os->pushBool(false); return 1; } } os->pushBool(len > 0); return 1; } static int my_hash(OS * os, int params, int, int, void*) { OS::String str = os->toString(-params); int i, len = str.getLen(), hash = 5381; for(i = 0; i < len; i++){ hash = ((hash << 5) + hash) + str[i]; } char buf[16]; hash &= 0x7fffffff; for(i = 0; hash > 0; hash >>= 4){ buf[i++] = "0123456789abcdef"[hash & 0xf]; } buf[i] = 0; os->pushString(buf); return 1; } void initMyModule(OS * os) { OS::FuncDef funcs[] = { {"isdigit", my_isdigit}, {"hash", my_hash}, {} }; os->getModule("my"); os->setFuncs(funcs); os->pop(); } void main() { OS * os = OS::create(); initMyModule(os); os->require("main.os"); os->release(); } 


рдЖрдк рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рдЗрд╕ рд▓реЗрдЦ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ , proj.win32 \ example.sln , add_user_module рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЦреЛрд▓реЗрдВ ред

ObjectScript рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреНрдп рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд▓реЗрдЦ:


PS OS::String рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдУрдкрд╕ OS::String


OS :: рд╕реНрдЯреНрд░рд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬрд┐рд╕реЗ рдХрд╕реНрдЯрдо C ++ рдХреЛрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдкрдиреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд╕рднреА рд╕рдордп рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдз рдореВрд▓реНрдп рд░рдЦрддреА рд╣реИред рдПрдХ рд╢реВрдиреНрдп-рд╕рдорд╛рдкреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, toChar() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред ObjectScript рдореЗрдореЛрд░реА рдореЗрдВ рд╕рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдПрдХ рд╣реА рдХреЙрдкреА рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП OS::String рдПрдХ рд╕реНрдерд┐рд░ рд▓рд╛рдЗрди рд╣реИ, рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рдПрдХ рдирдИ рд▓рд╛рдЗрди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред OS::String рдХрдИ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдФрд░ рдПрдХ рдХреЙрдиреНрдЯреИрдХреНрд╢рди рдСрдкрд░реЗрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП OS::String рдХреЛ рдпреВрдЬрд░ рдХреЛрдб рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ)ред

рдкреНрд░рд╢реНрди: OS::String os->release() рд╕реЗ рдкрд╣рд▓реЗ рдЕрдЧрд░ OS::String os->release() рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ os->release() OS::String рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд OS::String рдХреЛ рдирд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?

A: OS :: рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрдХ OS рдЙрджрд╛рд╣рд░рдг рдХреЛ рдкрдХрдбрд╝рддреА рд╣реИ, рдпрд╣ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рд╣рд░реА рдХреЛрдб рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, os->release() OS рдЖрд╡реГрддреНрддрд┐ рдХреЛ рдирд╖реНрдЯ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо OS::String рдореМрдЬреВрдж рд╣реЛрдиреЗ рдкрд░ рдпрд╣ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

Source: https://habr.com/ru/post/In153021/


All Articles