blob: fbc678900c6d00f92a9dc7edee88616fced927f5 [file] [log] [blame]
Roger Meier6cf0ffc2014-04-05 00:45:42 +02001//
2// Licensed to the Apache Software Foundation (ASF) under one
3// or more contributor license agreements. See the NOTICE file
4// distributed with this work for additional information
5// regarding copyright ownership. The ASF licenses this file
6// to you under the Apache License, Version 2.0 (the
7// "License"); you may not use this file except in compliance
8// with the License. You may obtain a copy of the License at
9//
10// http://www.apache.org/licenses/LICENSE-2.0
11//
12// Unless required by applicable law or agreed to in writing,
13// software distributed under the License is distributed on an
14// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15// KIND, either express or implied. See the License for the
16// specific language governing permissions and limitations
17// under the License.
18//
19
20#include <lua.h>
21#include <lauxlib.h>
22#include <stdlib.h>
23#include <inttypes.h>
24
25const char * LONG_NUM_TYPE = "__thrift_longnumber";
26int64_t lualongnumber_checklong(lua_State *L, int index) {
27 switch (lua_type(L, index)) {
28 case LUA_TNUMBER:
29 return (int64_t)lua_tonumber(L, index);
30 case LUA_TSTRING:
31 return atoll(lua_tostring(L, index));
32 default:
33 return *((int64_t *)luaL_checkudata(L, index, LONG_NUM_TYPE));
34 }
35}
36
37// Creates a new longnumber and pushes it onto the statck
38int64_t * lualongnumber_pushlong(lua_State *L, int64_t *val) {
39 int64_t *data = (int64_t *)lua_newuserdata(L, sizeof(int64_t)); // longnum
40 luaL_getmetatable(L, LONG_NUM_TYPE); // longnum, mt
41 lua_setmetatable(L, -2); // longnum
42 if (val) {
43 *data = *val;
44 }
45 return data;
46}
47