From ea1947ffcc606d757357398b24e74a3f4ecefa07 Mon Sep 17 00:00:00 2001 From: neonloop Date: Wed, 20 Oct 2021 14:54:27 +0000 Subject: Initial commit from steward-fu release --- modules/mod_dir/mod_dir.c | 269 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 modules/mod_dir/mod_dir.c (limited to 'modules/mod_dir/mod_dir.c') diff --git a/modules/mod_dir/mod_dir.c b/modules/mod_dir/mod_dir.c new file mode 100644 index 0000000..286a7e7 --- /dev/null +++ b/modules/mod_dir/mod_dir.c @@ -0,0 +1,269 @@ +/* + * Copyright © 2006-2016 SplinterGU (Fenix/Bennugd) + * Copyright © 2002-2006 Fenix Team (Fenix) + * Copyright © 1999-2002 José Luis Cebrián Pagüe (Fenix) + * + * This file is part of Bennu - Game Development + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + */ + +#include +#include +#include +#include +#include + +#include "dirs.h" + +/* WIN32 INCLUDES */ +#ifdef WIN32 +#include +#include +#include +#else +#include +#include +/* BeOS INCLUDES */ +#ifdef TARGET_BEOS +#include +#endif +#include +#include +#endif + +#include "bgddl.h" +#include "dlvaracc.h" +#include "files.h" +#include "xstrings.h" + +/* ----------------------------------------------------------------- */ + +enum +{ + FILE_PATH = 0, + FILE_NAME, + FILE_DIRECTORY, + FILE_HIDDEN, + FILE_READONLY, + FILE_SIZE, + FILE_CREATED, + FILE_MODIFIED, + FILE_ACCESSED, + FILE_STATECHG +} ; + +/* ----------------------------------------------------------------- */ +/* Son las variables que se desea acceder. */ +/* El interprete completa esta estructura, si la variable existe. */ +/* (usada en tiempo de ejecucion) */ + +DLVARFIXUP __bgdexport( mod_dir, globals_fixup)[] = + { + /* Nombre de variable global, puntero al dato, tamaño del elemento, cantidad de elementos */ + { "fileinfo.path" , NULL, -1, -1 }, + { "fileinfo.name" , NULL, -1, -1 }, + { "fileinfo.directory" , NULL, -1, -1 }, + { "fileinfo.hidden" , NULL, -1, -1 }, + { "fileinfo.readonly" , NULL, -1, -1 }, + { "fileinfo.size" , NULL, -1, -1 }, + { "fileinfo.created" , NULL, -1, -1 }, + { "fileinfo.modified" , NULL, -1, -1 }, + { "fileinfo.accessed" , NULL, -1, -1 }, + { "fileinfo.statechg" , NULL, -1, -1 }, + { NULL, NULL, -1, -1 } + }; + +/* ----------------------------------------------------------------- */ +/* DIRECTORY FUNCTIONS */ + +static int moddir_cd( INSTANCE * my, int * params ) +{ + char * d = dir_current() ; + int r = string_new( d ) ; + string_use( r ) ; + if ( d ) free( d ) ; + return r ; +} + +static int moddir_chdir( INSTANCE * my, int * params ) +{ + const char * d = string_get( params[ 0 ] ) ; + int ret = dir_change( d ) ; + string_discard( params[ 0 ] ) ; + return ( ret ) ; +} + +static int moddir_mkdir( INSTANCE * my, int * params ) +{ + const char * d = string_get( params[ 0 ] ) ; + int ret = dir_create( d ) ; + string_discard( params[ 0 ] ) ; + return ( ret ) ; +} + +static int moddir_rmdir( INSTANCE * my, int * params ) +{ + const char * d = string_get( params[ 0 ] ) ; + int ret = dir_delete( d ); + string_discard( params[ 0 ] ) ; + return ( ret ) ; +} + +static int moddir_rm( INSTANCE * my, int * params ) +{ + const char * d = string_get( params[ 0 ] ) ; + int ret = dir_deletefile( d ); + string_discard( params[ 0 ] ) ; + return ( ret ) ; +} + +static int __moddir_read(__DIR_ST * dh ) +{ + __DIR_FILEINFO_ST * dif; + char buffer[ 20 ]; + int result; + + dif = dir_read( dh ); + if ( !dif ) + { + result = string_new( "" ); + string_use( result ); + return ( result ); + } + + /* discard previous strings values */ + string_discard( GLODWORD( mod_dir, FILE_NAME ) ); + string_discard( GLODWORD( mod_dir, FILE_PATH ) ); + string_discard( GLODWORD( mod_dir, FILE_CREATED ) ); + string_discard( GLODWORD( mod_dir, FILE_MODIFIED ) ); + string_discard( GLODWORD( mod_dir, FILE_ACCESSED ) ); + string_discard( GLODWORD( mod_dir, FILE_STATECHG ) ); + + GLODWORD( mod_dir, FILE_NAME ) = string_new( dif->filename ); string_use( GLODWORD( mod_dir, FILE_NAME ) ); + GLODWORD( mod_dir, FILE_PATH ) = string_new( dif->fullpath ); string_use( GLODWORD( mod_dir, FILE_PATH ) ); + + GLODWORD( mod_dir, FILE_DIRECTORY ) = dif->attributes & DIR_FI_ATTR_DIRECTORY ? 1 : 0; + GLODWORD( mod_dir, FILE_HIDDEN ) = dif->attributes & DIR_FI_ATTR_HIDDEN ? 1 : 0; + GLODWORD( mod_dir, FILE_READONLY ) = dif->attributes & DIR_FI_ATTR_READONLY ? 1 : 0; + GLODWORD( mod_dir, FILE_SIZE ) = dif->size; + + /* Store file times */ +#ifdef _WIN32 + strftime( buffer, 20, "%d/%m/%Y %H:%M:S", &dif->mtime ); + GLODWORD( mod_dir, FILE_CREATED ) = string_new( buffer ); string_use( GLODWORD( mod_dir, FILE_CREATED ) ); +#else + GLODWORD( mod_dir, FILE_CREATED ) = string_new( "" ); string_use( GLODWORD( mod_dir, FILE_CREATED ) ); +#endif + + strftime( buffer, 20, "%d/%m/%Y %H:%M:S", &dif->crtime ); + GLODWORD( mod_dir, FILE_MODIFIED ) = string_new( buffer ); string_use( GLODWORD( mod_dir, FILE_MODIFIED ) ); + + strftime( buffer, 20, "%d/%m/%Y %H:%M:S", &dif->atime ); + GLODWORD( mod_dir, FILE_ACCESSED ) = string_new( buffer ); string_use( GLODWORD( mod_dir, FILE_ACCESSED ) ); + +#ifndef _WIN32 + strftime( buffer, 20, "%d/%m/%Y %H:%M:S", &dif->ctime ); + GLODWORD( mod_dir, FILE_STATECHG ) = string_new( buffer ); string_use( GLODWORD( mod_dir, FILE_STATECHG ) ); +#else + GLODWORD( mod_dir, FILE_STATECHG ) = string_new( "" ); string_use( GLODWORD( mod_dir, FILE_STATECHG ) ); +#endif + + /* Return */ + result = GLODWORD( mod_dir, FILE_NAME ); + string_use( result ); + return result; +} + +/* string GLOB (STRING path) + * + * Given a path with wildcards ('*' or '?' characters), returns the first + * file that matches and, in every next call, all matching files found + * until no more files exists. It then returns NIL. + */ + +static int moddir_glob( INSTANCE * my, int * params ) +{ + const char * path = string_get( params[ 0 ] ); + static __DIR_ST * dh = NULL; + int result; + + if ( dh && strcmp( dh->path, path ) ) + { + dir_close( dh ); + dh = NULL; + } + + if ( !dh ) dh = dir_open( path ); + + string_discard( params[ 0 ] ); + + if ( !dh ) + { + result = string_new( "" ); + string_use( result ); + return ( result ); + } + + return ( __moddir_read( dh ) ) ; +} + +/* int DIROPEN (STRING path) + * + * Open a dir for read it, returns handle id. + * return 0 if fail. + */ + +static int moddir_open( INSTANCE * my, int * params ) +{ + int result = ( int ) dir_open( string_get( params[ 0 ] ) ); + string_discard( params[ 0 ] ); + return result; +} + +/* int DIRCLOSE (INT handle) + */ + +static int moddir_close( INSTANCE * my, int * params ) +{ + if ( params[ 0 ] ) dir_close ( ( __DIR_ST * ) params[ 0 ] ) ; + return 1; +} + +/* string DIRREAD (INT handle) + * + * Given a path with wildcards ('*' or '?' characters), returns the first + * file that matches and, in every next call, all matching files found + * until no more files exists. It then returns NIL. + */ + +static int moddir_read( INSTANCE * my, int * params ) +{ + return ( __moddir_read((__DIR_ST *) params[ 0 ] ) ) ; +} + +/* ----------------------------------------------------------------- */ +/* exports */ +/* ----------------------------------------------------------------- */ + +#include "mod_dir_exports.h" + +/* ----------------------------------------------------------------- */ -- cgit v1.2.3