
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.

   Copyright 2007-2020 Thomas Schmitt, <scdbackup@gmx.net>

   Provided under GPL version 2 or later.

   This file contains declarations of functions around files and strings.
*/


#ifndef Xorriso_pvt_sfile_includeD
#define Xorriso_pvt_sfile_includeD yes

#define TSOB_FELD(typ, count) (typ *) calloc(1, (count)*sizeof(typ));
#define Smem_malloC malloc
#define Smem_freE free

#define Xorriso_alloc_meM(pt, typ, count) { \
  pt= (typ *) calloc(1, (count) * sizeof(typ)); \
  if(pt == NULL) { \
    Xorriso_no_malloc_memory(xorriso, NULL, 0); \
    ret= -1; \
    goto ex; \
  } }

#define Xorriso_free_meM(pt) { \
  if(pt != NULL) \
    free((char *) pt); \
  pt= NULL; \
  }


#define SfileadrL 4096


int Sfile_str(char *target, char *source, int flag); 
 
double Sfile_microtime(int flag);
  
int Sfile_add_to_path(char path[SfileadrL], char *addon, int flag);
  
int Sfile_scale(double value, char *result, int siz, double thresh, int flag);
  
int Sfile_destroy_argv(int *argc, char ***argv, int flag);

int Sfile_count_char(char *text, char to_count);

 
/*
 bit0= do not ignore trailing slash
 bit1= do not ignore empty components (other than the empty root name)
*/
int Sfile_count_components(char *path, int flag);

/*
 @param flag
 bit0= return -1 if file is missing
 bit1= return a hardlink with siblings as type 5
 bit2= evaluate eventual link target rather than the link object itself
 bit3= return a socket or a char device as types 7 or 8 rather than 0
 @return
  0=unknown
  1=regular
  2=directory
  3=symbolic link
  4=named pipe
  5=multiple hardlink (with bit1)
  6=block device
  7=socket (with bit3)
  8=character device (with bit3)
 | 1024 if interpreted as /dev/fd/#fd#
 | 2048 if interpreted as /dev/fd/#fd# and not fstatable
*/
int Sfile_type(char *filename, int flag);

/* @param flag bit0= only encode inside quotes
               bit1= encode < 32 outside quotes except 7, 8, 9, 10, 12, 13
               bit2= encode in any case above 126
               bit3= encode in any case shellsafe:
                     <=42 , 59, 60, 62, 63, 92, 94, 96, >=123
*/
int Sfile_bsl_encoder(char **result, char *text, size_t text_len, int flag);

int Sfile_argv_bsl(int argc, char ***argv, int flag);

/*
 bit0= read progname as first argument from line
 bit1= just release argument list argv and return
 bit2= abort with return(0) if incomplete quotes are found
 bit3= eventually prepend missing '-' to first argument read from line
 bit4= like bit2 but only check quote completeness, do not allocate memory
 bit5+6= interpretation of backslashes:
       0= no interpretation, leave unchanged
       1= only inside double quotes
       2= outside single quotes
       3= everywhere
 bit7= append a NULL element to argv
*/
int Sfile_make_argv(char *progname, char *line, int *argc, char ***argv,
                    int flag);
int Sfile_sep_make_argv(char *progname, char *line, char *separators,
                        int max_argc, int *argc, char ***argv, int flag);

/* YYMMDD[.hhmm[ss]] */
int Sfile_decode_datestr(struct tm *reply, char *text, int flag);

int Sfile_off_t_text(char text[80], off_t num, int flag);
int Sfile_text_to_off_t(char *text, off_t *num, int flag);

int Sfile_leafname(char *path, char leafname[SfileadrL], int flag);

/* @param flag bit0= do not clip of carriage return at line end
*/
char *Sfile_fgets_n(char *line, int maxl, FILE *fp, int flag);

/*
 bit0=with hours+minutes
 bit1=with seconds

 bit8= local time rather than UTC
*/
char *Sfile_datestr(time_t tim, short int flag);

/* Converts backslash codes into single characters:
    \a BEL 7 , \b BS 8 , \e ESC 27 , \f FF 12 , \n LF 10 , \r CR 13 ,
    \t  HT 9 , \v VT 11 , \\ \ 92
    \[0-9][0-9][0-9] octal code , \x[0-9a-f][0-9a-f] hex code ,
    \cX control-x (ascii(X)-64)
   @param upto  maximum number of characters to examine for backslash.
                The scope of a backslash (0 to 3 characters) is not affected.
   @param eaten returns the difference in length between input and output
   @param flag bit0= only determine *eaten, do not convert
               bit1= convert \000 to binary 0
*/
int Sfile_bsl_interpreter(char *text, int upto, int *eaten, int flag);

int Sfile_prepend_path(char *prefix, char path[SfileadrL], int flag);

int Sfile_home_adr_s(char *filename, char *fileadr, int fa_size, int flag);

int Sfile_get_dev_fd_no(char *filename, int flag);

int Sfile_flatten_utf8_heads(char *name, int idx, int flag);

#endif /* ! Xorriso_pvt_sfile_includeD */

