git @ Cat's Eye Technologies OpenZz / master src / defopen.c
master

Tree @master (Download .tar.gz)

defopen.c @masterraw · history · blame

/* 
    Zz Dynamic Parser Library
    Copyright (C) 1989 - I.N.F.N - S.Cabasino, P.S.Paolucci, G.M.Todesco

    The Zz Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    The Zz Library 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
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/


#include <string.h>
#include <stdio.h>
#include <stdlib.h>

//--------------------------------------------------------------------
//  Modified version of defopen for opening INPUT files
//  
//  Tries to open an input-file with name derived from *infile 
//  and extension *ext. The leading '.' in ext is optional. 
//  NULL is returned if no file can be opend.
//  
//  The name of the searched file is derived as follows:
//  If the basename of *infile (i.e. *infile without path) 
//  contains no '.', *ext is appended as extension. Otherwise,
//  if the basename of *infile contains a '.', only the file
//  with name identical to the basename is opened (i.e. the 
//  default extension *ext is ignored).
//
//  The file is searched in the following directories:
//  If *infile contains a path specification (i.e. a '/'), 
//  the file is only searched in the specified path.
//  Otherwise, if *infile contains no path specification,
//  all directories in the environment variable *ext are
//  searched. The variable is interpreted as a colon (':') 
//  separated list. The current working directory is automatically
//  appended to the list in *env (note: './' should be prepended
//  to the variable in *env only when the local files should be 
//  considered really before the ones in the other *env
//  directories)
//
//  hs 27/4/98
//
//  $Id: defopen.c,v 1.3 2002/01/11 11:52:02 brooks Exp $
//--------------------------------------------------------------------

FILE *defin(char *infile, char *ext, char *env, char *mode/*="r"*/) {
#define MAXLENG 250
  FILE *fp;
  char *sp;
  int i, l, p_name, p_dot, p_dir;
  char name[MAXLENG], dirs[MAXLENG], buffer[MAXLENG];

  // search infile for basename and extension
  p_name = 0;
  p_dot  = -1;

  for( i=0; infile[i] != '\0'; i++) {           
    if(infile[i]=='/') p_name = i+1;
    if(infile[i]=='.') p_dot = i;
  }

  strcpy(name,&infile[p_name]);

  if ( p_dot < p_name ) {    // infile contains no extension
    if ( *ext != '.' && strlen(ext) > 0 ) strcat(name,".");
    strcat(name,ext);
  }

  if ( p_name > 0 ) {        // infile contains a path specification
    strcpy(dirs,infile);
    dirs[p_name] = 0;
  }
  else 
    if( (sp=getenv(env))!=NULL ) 
      {
	strcpy(dirs,sp);
	strcat(dirs,":.");    // append '.' to directories
      }
    else                      // default directory '.'
      strcpy(dirs,".");
  
  
  l=strlen(dirs);
  for (p_dir=0, i=0 ; i<=l ; i++ ) {
    if (dirs[i]==':' || dirs[i]=='\0')	{
      if ( dirs[i-1] == '/' ) dirs[i-1] = 0;
      else dirs[i]=0;

      sprintf(buffer, "%s/%s", &dirs[p_dir], name); 
      // printf("try %s: \n",buffer);
      if ( (fp=fopen(buffer,mode))!=NULL ) return (fp);
      
      p_dir=i+1;
    }
  }
  return NULL;
}

//--------------------------------------------------------------------
//  Modified version of defopen for opening OUTPUT files
//  
//  Opens an output-file with name `base.ext' where in base
//  the path and extension of infile is stripped off.
//  The leading '.' in ext is optional. 
//
//  hs 27/4/98
//---------------------------------------------------------------------

FILE *defout(char *infile, char *ext, char *mode/*="w"*/) {
#define MAXLENG 250
  int i, p_dot, p_name;
  char buffer[MAXLENG];

  // search infile for path and extension
  p_name = 0;
  p_dot  = -1;

  for( i=0; infile[i] != '\0'; i++) {           
    if(infile[i]=='/') p_name = i+1;
    if(infile[i]=='.') p_dot = i;
  }

  // strip off path:
  strcpy(buffer,&infile[p_name]);
  
  // strip off extension:
  if ( p_dot > -1 ) buffer[p_dot-p_name] = 0;

  // append new extension:
  if ( *ext != '.' && strlen(ext)>0 ) strcat(buffer,".");
  strcat(buffer,ext);

  return fopen(buffer,mode);
}

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

int get_path_length(char *fullfilename)
{
  int i,l;
  i = strlen(fullfilename)-1;   /* la funzione strlen conta il numero 
                                   di caratteri di fullfilname, escluso 
                                   il carattere nullo di fine stringa */
  while(i>=0 && fullfilename[i]!='/') 
    i--;
  return i+1;
}
//---------------------------------------------------------------------

void get_filetype(char *fullfilename,char *filetype) {
  char *s;
  int i;
  i = get_path_length(fullfilename);
  s = fullfilename+i;
  while(*s && *s!='.' && *s!=';')s++;
  if(*s=='.') 
    {
      s++;
      while(*s && *s!=';')
	*filetype++ = *s++;
    }
  *filetype = '\0';
}

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

void change_filetype(char *fullfilename,char *filetype) {
  char tmp[256];
  char *s,*t;
  int i;
  if(*filetype=='.') filetype++;
  i = get_path_length(fullfilename);
  s = fullfilename+i;
  while(*s && *s!='.' && *s!=';')s++;
  t = s;
  while(*t && *t!=';') t++;
  if(*t==';') strcpy(tmp,t);
  else tmp[0]='\0';
  *s++ = '.';
  while(*filetype) 
    *s++ = *filetype++;
  strcpy(s,tmp);
}
//--------------------- end of file --------------------------------