//	ggfs.c		gg630504 hg9ieg linux.ubuntu.gcc
//	2010-01-26

#ifndef _ggfs_
#define _ggfs_

#include <dirent.h>
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <utime.h>

#include "ggstd.h"
#include "ggdt.h"


#define sFileBlock	4096

#define bwFlagCreate	( O_CREAT | O_WRONLY | O_TRUNC )
#define bwFlagRead	( O_RDONLY  )
#define bwModeCreate	( S_IRUSR | S_IWUSR           | S_IRGRP | S_IWGRP           | S_IROTH | S_IWOTH )
#define bwModeMkdir	( S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP           | S_IXGRP | S_IROTH           | S_IXOTH )

#define szFileNameSep	"/"
#define chFileNameSep	'/'
#define chFileExtSep	'.'
#define chFileDefault	'_'

#define chDot		'.'
#define szOwnDir	"."
#define szOwn_Dir	"./"
#define szParentDir	".."
#define chRootDir	'/'
#define szRootDir	"/"

// rendezés "tiX"

#define chSortSubFirst	'1' // rekurzív, először: alkönyvtárak, utána: könyvtárak & állományok
#define chSortSubFollow	'2' // rekurzív, alkönyvtárak feldolgozása közvetlenül a könyvtár után
#define chSortSubLast	'3' // rekurzív, először: könyvtárak & állományok, utána: alkönyvtárak


#define chSortTypeDec	'T' // file - dir
#define chSortTypeInc	't' // dir - file

#define chSortNameDec	'N'
#define chSortNameInc	'n'

#define chSortExtDec	'E'
#define chSortExtInc	'e'

#define chSortIdDec	'I'
#define chSortIdInc	'i'

#define chSortDateDec	'D'
#define chSortDateInc	'd'

#define chSortSizeDec	'S'
#define chSortSizeInc	's'

#define chSortRoot	'r'

//---------------------------------------------------------------------

typedef FILE *	H;
typedef int	FD;	// file descriptor



typedef struct	{	// állománynév és mód leíró
SA		saPath;	// Dir+Id = Dir+Name+Ext,	PATH_MAX
SA		saDir;	//				NAME_MAX+1
SA		saId;	// == Name + Ext		NAME_MAX+1
SA		saName;	//				NAME_MAX+1
SA 		saExt;	//				NAME_MAX+1
struct stat	st;	// S_ISDIR( pxfn_->st.st_mode )
//PV		pv;	// extra data
}		XFN;

typedef XFN *	PXFN;





typedef struct	{
CU		cu;	// unicode karakter	Árvíztűrő<>
CH		ch;	// karakter, 7 bites	Arvizturo__
}		CHCUFN;	// állományazonosító konvertáláshoz


#define NullXfn( x_ )	(x_).saPath = (x_).saDir = (x_).saId = (x_).saName = (x_).saExt = NULL
#define NullPxfn( x_ )	(x_)->saPath = (x_)->saDir = (x_)->saId = (x_)->saName = (x_)->saExt = NULL



CU		CuGetH( H );			// utf-8-as unikódot olvas
F		FExistSz( SZ );			// létezés
FS		FsCopySzSz( SZ, SZ );		// file másolás
PDT		PdtGetPdtSz( PDT, SZ );		// file módosítási idő lekérdezés
R		RCopyTimeSzSz( SZ, SZ );	// file idők másolása
R		RReadFdSzCt( FD, SZ, CT );	// stringet olvas állományból

//

R		RFnSzSzCh( SZ, SZ, CH );		// 7bites állománynév
R		RFreePxfn( PXFN );
R		RMkdirSz( SZ );				//
R		RMkdirsSz( SZ );
R		RNormPxfnSz( PXFN, SZ );		// Path
R		RNormPxfnSzSz( PXFN, SZ, SZ );		// Dir, Id
R		RNormPxfnSzSzSz( PXFN, SZ, SZ, SZ );	// Dir, Name, Ext
R		RPathAddSzSzSz( SZ, SZ, SZ );
R		RPathNormSzSz( SZ, SZ );
R		RUniquePxfnPxfn( PXFN, PXFN );		// egyedi állomány azonosító (sorszám++)
SA		SaChangeDirSzSzCt( SZ, SZ, CT );
SA		SaPathAddSzSz( SZ, SZ );

//---------------------------------------------------------------------

typedef R	(*R_PXFNWPV)( PXFN, W, PV );		// R	R_( PXFN, W, PV );
R		RLsSzRfnSzPv( SZ, R_PXFNWPV, SZ, PV );	// list
/*
R		R_PxfnWPv( pxfn_, w_, pv_ )
PXFN		pxfn_;
W		w_;
PV		pv_;
{
return( r );
}
*/




typedef R	(*R_PXFNSZWPV)( PXFN, SZ, W, PV );		// sou dest
R		RDupSzSzRfnPv( SZ, SZ, R_PXFNSZWPV, PV );	// tree to tree
/*
R		R_PxfnSzWPv( pxfnSou_, szDest_, w_, pv_ )
PXFN		pxfnSou_;
SZ		szDest_;
W		w_;
PV		pv_;
{
return( r );
}
*/

//---------------------------------------------------------------------

#define iffopen( h_, sn_, st_ )		if( (h_=fopen( sn_, st_ ))==NULL )	goto ret;
#define iffopenr( h_, sn_, st_ )	if( (h_=fopen( sn_, st_ ))==NULL )	{ r = rOpen; goto ret; };

#define iffclose( h_ )			if( (h_)!=NULL ) { fclose( h_ ); h_ = NULL; }



#define ifclose( fd_ )			if( (fd_)>=0 ) { close( fd_ ); fd_ = -1; }
#define ifcloser( fd_ )			if( (fd_)>=0 ) { r = close( fd_ ); fd_ = -1; }




#endif

