1 //
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 
25 const char * LONG_NUM_TYPE = "__thrift_longnumber";
lualongnumber_checklong(lua_State * L,int index)26 int64_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
lualongnumber_pushlong(lua_State * L,int64_t * val)38 int64_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 
48