mf_format.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:4k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include "mysys_priv.h"
  14. #include <m_string.h>
  15. /*
  16.   Formats a filename with possible replace of directory of extension
  17.   Function can handle the case where 'to' == 'name'
  18.   For a description of the flag values, consult my_sys.h
  19.   The arguments should be in unix format.
  20. */
  21. my_string fn_format(my_string to, const char *name, const char *dir,
  22.     const char *extension, uint flag)
  23. {
  24.   reg1 uint length;
  25.   char dev[FN_REFLEN], buff[FN_REFLEN], *pos, *startpos;
  26.   const char *ext;
  27.   DBUG_ENTER("fn_format");
  28.   DBUG_PRINT("enter",("name: %s  dir: %s  extension: %s  flag: %d",
  29.        name,dir,extension,flag));
  30.   /* Copy and skip directory */
  31.   name+=(length=dirname_part(dev,(startpos=(my_string) name)));
  32.   if (length == 0 || (flag & MY_REPLACE_DIR))
  33.   {
  34.     /* Use given directory */
  35.     convert_dirname(dev,dir,NullS); /* Fix to this OS */
  36.   }
  37.   else if ((flag & MY_RELATIVE_PATH) && !test_if_hard_path(dev))
  38.   {
  39.     /* Put 'dir' before the given path */
  40.     strmake(buff,dev,sizeof(buff)-1);
  41.     pos=convert_dirname(dev,dir,NullS);
  42.     strmake(pos,buff,sizeof(buff)-1- (int) (pos-dev));
  43.   }
  44.   if (flag & MY_PACK_FILENAME)
  45.     pack_dirname(dev,dev); /* Put in ./.. and ~/.. */
  46.   if (flag & MY_UNPACK_FILENAME)
  47.     (void) unpack_dirname(dev,dev); /* Replace ~/.. with dir */
  48.   if ((pos= (char*) strchr(name,FN_EXTCHAR)) != NullS)
  49.   {
  50.     if ((flag & MY_REPLACE_EXT) == 0) /* If we should keep old ext */
  51.     {
  52.       length=strlength(name); /* Use old extension */
  53.       ext = "";
  54.     }
  55.     else
  56.     {
  57.       length=(uint) (pos-(char*) name); /* Change extension */
  58.       ext= extension;
  59.     }
  60.   }
  61.   else
  62.   {
  63.     length=strlength(name); /* No ext, use the now one */
  64.     ext=extension;
  65.   }
  66.   if (strlen(dev)+length+strlen(ext) >= FN_REFLEN || length >= FN_LEN )
  67.   {
  68.     /* To long path, return original or NULL */
  69.     uint tmp_length;
  70.     if (flag & MY_SAFE_PATH)
  71.       return NullS;
  72.     tmp_length=strlength(startpos);
  73.     DBUG_PRINT("error",("dev: '%s'  ext: '%s'  length: %d",dev,ext,length));
  74.     (void) strmake(to,startpos,min(tmp_length,FN_REFLEN-1));
  75.   }
  76.   else
  77.   {
  78.     if (to == startpos)
  79.     {
  80.       bmove(buff,(char*) name,length); /* Save name for last copy */
  81.       name=buff;
  82.     }
  83.     pos=strmake(strmov(to,dev),name,length);
  84.     (void) strmov(pos,ext); /* Don't convert extension */
  85.   }
  86.   /*
  87.     If MY_RETURN_REAL_PATH and MY_RESOLVE_SYMLINK is given, only do
  88.     realpath if the file is a symbolic link
  89.   */
  90.   if (flag & MY_RETURN_REAL_PATH)
  91.     (void) my_realpath(to, to, MYF(flag & MY_RESOLVE_SYMLINKS ?
  92.    MY_RESOLVE_LINK: 0));
  93.   else if (flag & MY_RESOLVE_SYMLINKS)
  94.   {
  95.     strmov(buff,to);
  96.     (void) my_readlink(to, buff, MYF(0));
  97.   }
  98.   DBUG_RETURN(to);
  99. } /* fn_format */
  100. /*
  101.   strlength(const string str)
  102.   Return length of string with end-space:s not counted.
  103.   */
  104. size_s strlength(const char *str)
  105. {
  106.   reg1 my_string pos;
  107.   reg2 my_string found;
  108.   DBUG_ENTER("strlength");
  109.   pos=found=(char*) str;
  110.   while (*pos)
  111.   {
  112.     if (*pos != ' ')
  113.     {
  114.       while (*++pos && *pos != ' ') {};
  115.       if (!*pos)
  116.       {
  117. found=pos; /* String ends here */
  118. break;
  119.       }
  120.     }
  121.     found=pos;
  122.     while (*++pos == ' ') {};
  123.   }
  124.   DBUG_RETURN((size_s) (found-(char*) str));
  125. } /* strlength */