#include "NasalClipboard.hxx"
#include "NasalSys.hxx"
+#include <simgear/nasal/cppbind/NasalCallContext.hxx>
#include <boost/algorithm/string/case_conv.hpp>
#include <cstddef>
* Nasal wrappers for setting/getting clipboard text
*/
//------------------------------------------------------------------------------
-static NasalClipboard::Type parseType(naContext c, int argc, naRef* args, int i)
+static NasalClipboard::Type parseType(const nasal::CallContext& ctx, size_t i)
{
- if( argc > i )
+ if( ctx.argc > i )
{
- if( !naIsString(args[i]) )
- naRuntimeError(c, "clipboard: invalid arg (not a string)");
-
- std::string type_str( naStr_data(args[i]) );
- boost::to_upper(type_str);
-
- if( type_str == "CLIPBOARD" )
- return NasalClipboard::CLIPBOARD;
- else if( type_str == "PRIMARY" || type_str == "SELECTION" )
- return NasalClipboard::PRIMARY;
- else
- naRuntimeError(c, "clipboard: unknown clipboard type");
+ if( ctx.isNumeric(i) )
+ {
+ if( ctx.requireArg<int>(i) == NasalClipboard::CLIPBOARD )
+ return NasalClipboard::CLIPBOARD;
+ if( ctx.requireArg<int>(i) == NasalClipboard::PRIMARY )
+ return NasalClipboard::PRIMARY;
+ }
+
+ naRuntimeError
+ (
+ ctx.c,
+ "clipboard: invalid arg "
+ "(expected clipboard.CLIPBOARD or clipboard.SELECTION)"
+ );
}
return NasalClipboard::CLIPBOARD;
}
//------------------------------------------------------------------------------
-static naRef f_setClipboardText(naContext c, naRef me, int argc, naRef* args)
+static naRef f_setClipboardText(const nasal::CallContext& ctx)
{
- if( argc < 1 || argc > 2 )
- naRuntimeError( c, "clipboard.setText() expects 1 or 2 arguments: "
- "text, [, type = \"CLIPBOARD\"]" );
-
- if( !naIsString(args[0]) )
- naRuntimeError(c, "clipboard.setText() invalid arg (arg 0 not a string)");
+ if( ctx.argc < 1 || ctx.argc > 2 )
+ naRuntimeError( ctx.c, "clipboard.setText() expects 1 or 2 arguments: "
+ "text, [, type = clipboard.CLIPBOARD]" );
return
naNum
(
- NasalClipboard::getInstance()->setText( naStr_data(args[0]),
- parseType(c, argc, args, 1) )
+ NasalClipboard::getInstance()->setText( ctx.requireArg<std::string>(0),
+ parseType(ctx, 1) )
);
}
//------------------------------------------------------------------------------
-static naRef f_getClipboardText(naContext c, naRef me, int argc, naRef* args)
+static naRef f_getClipboardText(const nasal::CallContext& ctx)
{
- if( argc > 1 )
- naRuntimeError(c, "clipboard.getText() accepts max 1 arg: "
- "[type = \"CLIPBOARD\"]" );
-
- const std::string& text =
- NasalClipboard::getInstance()->getText(parseType(c, argc, args, 0));
-
- // TODO create some nasal helper functions (eg. stringToNasal)
- // some functions are available spread over different files (eg.
- // NasalPositioned.cxx)
- return naStr_fromdata(naNewString(c), text.c_str(), text.length());
+ if( ctx.argc > 1 )
+ naRuntimeError(ctx.c, "clipboard.getText() accepts max 1 arg: "
+ "[type = clipboard.CLIPBOARD]");
+
+ return ctx.to_nasal
+ (
+ NasalClipboard::getInstance()->getText(parseType(ctx, 0))
+ );
}
-//------------------------------------------------------------------------------
-// Table of extension functions, terminate with 0,0
-static struct {const char* name; naCFunction func; } funcs[] = {
- { "setText", f_setClipboardText },
- { "getText", f_getClipboardText },
- { 0,0 } // TERMINATION
-};
-
//------------------------------------------------------------------------------
NasalClipboard::Ptr NasalClipboard::_clipboard;
-naRef NasalClipboard::_clipboard_hash;
//------------------------------------------------------------------------------
NasalClipboard::~NasalClipboard()
void NasalClipboard::init(FGNasalSys *nasal)
{
_clipboard = create();
- _clipboard_hash = naNewHash(nasal->context());
-
- nasal->globalsSet("clipboard", _clipboard_hash);
- for(size_t i=0;funcs[i].name;i++)
- {
- nasal->hashset
- (
- _clipboard_hash,
- funcs[i].name,
- naNewFunc(nasal->context(), naNewCCode(nasal->context(), funcs[i].func))
- );
+ nasal::Hash clipboard = nasal->getGlobals().createHash("clipboard");
- SG_LOG(SG_NASAL, SG_DEBUG, "Adding clipboard function: " << funcs[i].name );
- }
+ clipboard.set("setText", f_setClipboardText);
+ clipboard.set("getText", f_getClipboardText);
+ clipboard.set("CLIPBOARD", NasalClipboard::CLIPBOARD);
+ clipboard.set("SELECTION", NasalClipboard::PRIMARY);
}
//------------------------------------------------------------------------------