From 9517fa1161a4ca719c6b14b0e21ad3b867c31762 Mon Sep 17 00:00:00 2001 From: Antoine Cellerier Date: Sat, 20 Feb 2010 21:19:01 +0100 Subject: [PATCH] Export VLC's md5 API. --- modules/misc/lua/Modules.am | 1 + modules/misc/lua/demux.c | 1 + modules/misc/lua/extension.c | 1 + modules/misc/lua/intf.c | 1 + modules/misc/lua/libs.h | 1 + modules/misc/lua/libs/md5.c | 126 ++++++++++++++++++++++++++ modules/misc/lua/meta.c | 1 + modules/misc/lua/services_discovery.c | 2 + share/lua/README.txt | 8 ++ 9 files changed, 142 insertions(+) create mode 100644 modules/misc/lua/libs/md5.c diff --git a/modules/misc/lua/Modules.am b/modules/misc/lua/Modules.am index c2105c7f1d..d715ef9798 100644 --- a/modules/misc/lua/Modules.am +++ b/modules/misc/lua/Modules.am @@ -16,6 +16,7 @@ SOURCES_lua = \ libs/httpd.c \ libs/input.c \ libs/input.h \ + libs/md5.c \ libs/messages.c \ libs/misc.c \ libs/misc.h \ diff --git a/modules/misc/lua/demux.c b/modules/misc/lua/demux.c index 1ffc049347..e201024bb5 100644 --- a/modules/misc/lua/demux.c +++ b/modules/misc/lua/demux.c @@ -139,6 +139,7 @@ static int probe_luascript( vlc_object_t *p_this, const char * psz_filename, luaopen_msg( L ); luaopen_strings( L ); luaopen_xml( L ); + luaopen_md5( L ); lua_pushlightuserdata( L, p_demux ); lua_setfield( L, -2, "private" ); lua_pushstring( L, p_demux->psz_path ); diff --git a/modules/misc/lua/extension.c b/modules/misc/lua/extension.c index 16c363f6e8..a6fa103359 100644 --- a/modules/misc/lua/extension.c +++ b/modules/misc/lua/extension.c @@ -736,6 +736,7 @@ static lua_State* GetLuaState( extensions_manager_t *p_mgr, luaopen_config( L ); luaopen_dialog( L, p_ext ); luaopen_input( L ); + luaopen_md5( L ); luaopen_msg( L ); luaopen_misc( L ); luaopen_net( L ); diff --git a/modules/misc/lua/intf.c b/modules/misc/lua/intf.c index 4a4de3baea..90bb782005 100644 --- a/modules/misc/lua/intf.c +++ b/modules/misc/lua/intf.c @@ -198,6 +198,7 @@ int Open_LuaIntf( vlc_object_t *p_this ) luaopen_volume( L ); luaopen_gettext( L ); luaopen_xml( L ); + luaopen_md5( L ); /* clean up */ lua_pop( L, 1 ); diff --git a/modules/misc/lua/libs.h b/modules/misc/lua/libs.h index 18f884ec13..8bca89c41d 100644 --- a/modules/misc/lua/libs.h +++ b/modules/misc/lua/libs.h @@ -45,5 +45,6 @@ void luaopen_volume( lua_State * ); void luaopen_gettext( lua_State * ); void luaopen_input_item( lua_State *L, input_item_t *item ); void luaopen_xml( lua_State *L ); +void luaopen_md5( lua_State *L ); #endif diff --git a/modules/misc/lua/libs/md5.c b/modules/misc/lua/libs/md5.c new file mode 100644 index 0000000000..1531a20e8e --- /dev/null +++ b/modules/misc/lua/libs/md5.c @@ -0,0 +1,126 @@ +/***************************************************************************** + * md5.c: md5 hashing functions + ***************************************************************************** + * Copyright (C) 2010 Antoine Cellerier + * $Id$ + * + * Authors: Antoine Cellerier + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/***************************************************************************** + * Preamble + *****************************************************************************/ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#include /* Low level lua C API */ +#include /* Higher level C API */ + +#include "../vlc.h" +#include "../libs.h" + +/***************************************************************************** + * + *****************************************************************************/ +static int vlclua_md5_create( lua_State * ); +static int vlclua_md5_add( lua_State * ); +static int vlclua_md5_end( lua_State * ); +static int vlclua_md5_hash( lua_State * ); + +static const luaL_Reg vlclua_md5_reg[] = { + { "add", vlclua_md5_add }, + { "end", vlclua_md5_end }, + { "end_", vlclua_md5_end }, + { "hash", vlclua_md5_hash }, + { NULL, NULL } +}; + +static int vlclua_md5_create( lua_State *L ) +{ + if( lua_gettop( L ) ) + { + /* If optional first argument is given, and it's a string, just + * return the string's hash */ + const char *psz_str = luaL_checkstring( L, 1 ); + struct md5_s md5; + InitMD5( &md5 ); + AddMD5( &md5, psz_str, strlen( psz_str ) ); + EndMD5( &md5 ); + char *psz_hash = psz_md5_hash( &md5 ); + lua_pushstring( L, psz_hash ); + free( psz_hash ); + return 1; + } + + struct md5_s *p_md5 = lua_newuserdata( L, sizeof( struct md5_s ) ); + InitMD5( p_md5 ); + + if( luaL_newmetatable( L, "md5" ) ) + { + lua_newtable( L ); + luaL_register( L, NULL, vlclua_md5_reg ); + lua_setfield( L, -2, "__index" ); + } + + lua_setmetatable( L, -2 ); + return 1; +} + +static int vlclua_md5_add( lua_State *L ) +{ + struct md5_s *p_md5 = (struct md5_s *)luaL_checkudata( L, 1, "md5" ); + if( !lua_isstring( L, 2 ) ) + luaL_error( L, "2nd argument should be a string" ); + size_t i_len = 0; + const char *psz_str = lua_tolstring( L, 2, &i_len ); + if( !psz_str ) + vlclua_error( L ); + + AddMD5( p_md5, psz_str, i_len ); + + return 0; +} + +static int vlclua_md5_end( lua_State *L ) +{ + struct md5_s *p_md5 = (struct md5_s *)luaL_checkudata( L, 1, "md5" ); + EndMD5( p_md5 ); + return 0; +} + +static int vlclua_md5_hash( lua_State *L ) +{ + struct md5_s *p_md5 = (struct md5_s *)luaL_checkudata( L, 1, "md5" ); + char *psz_hash = psz_md5_hash( p_md5 ); + lua_pushstring( L, psz_hash ); + free( psz_hash ); + return 1; +} + +void luaopen_md5( lua_State *L ) +{ + lua_pushcfunction( L, vlclua_md5_create ); + lua_setfield( L, -2, "md5" ); +} diff --git a/modules/misc/lua/meta.c b/modules/misc/lua/meta.c index 0cd6e860d4..200ae2f6cc 100644 --- a/modules/misc/lua/meta.c +++ b/modules/misc/lua/meta.c @@ -72,6 +72,7 @@ static lua_State * init( vlc_object_t *p_this, input_item_t * p_item, const char luaopen_object( L ); luaopen_misc( L ); luaopen_xml( L ); + luaopen_md5( L ); luaopen_input_item( L, p_item ); lua_pushlightuserdata( L, p_this ); diff --git a/modules/misc/lua/services_discovery.c b/modules/misc/lua/services_discovery.c index 9268303f63..ebe2484191 100644 --- a/modules/misc/lua/services_discovery.c +++ b/modules/misc/lua/services_discovery.c @@ -110,7 +110,9 @@ int Open_LuaSD( vlc_object_t *p_this ) luaopen_stream( L ); luaopen_gettext( L ); luaopen_xml( L ); + luaopen_md5( L ); lua_pop( L, 1 ); + if( vlclua_add_modules_path( p_sd, L, p_sys->psz_filename ) ) { msg_Warn( p_sd, "Error while setting the module search path for %s", diff --git a/share/lua/README.txt b/share/lua/README.txt index 15d92aade7..f7e6283edb 100644 --- a/share/lua/README.txt +++ b/share/lua/README.txt @@ -130,6 +130,14 @@ input.item(): Get the current input item. Input item methods are: .played_abuffers .lost_abuffers +MD5 +--- +md5( str ): return the string's hash +md5(): create an md5 object with the following methods: + :add( str ): add a string to the hash + :end_(): finish hashing + :hash(): return the hash + Messages -------- msg.dbg( [str1, [str2, [...]]] ): Output debug messages (-vv). -- 2.39.2