mf_format.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:4k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Library General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2 of the License, or (at your option) any later version.
  7.    
  8.    This library is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    Library General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17. #include "mysys_priv.h"
  18. #include <m_string.h>
  19. #ifdef HAVE_REALPATH
  20. #include <sys/param.h>
  21. #include <sys/stat.h>
  22. #endif
  23. /* format a filename with replace of library and extension */
  24. /* params to and name may be identicall */
  25. /* function doesn't change name if name != to */
  26. /* Flag may be: 1   replace filenames library with 'dsk' */
  27. /* 2   replace extension with 'form' */
  28. /* 4   Unpack filename (replace ~ with home) */
  29. /* 8   Pack filename as short as possibly */
  30. /* 16  Resolve symbolic links for filename */
  31. /* 32  Resolve filename to full path */
  32. /* 64  Return NULL if too long path */
  33. #ifdef SCO
  34. #define BUFF_LEN 4097
  35. #else
  36. #ifdef MAXPATHLEN
  37. #define BUFF_LEN MAXPATHLEN
  38. #else
  39. #define BUFF_LEN FN_LEN
  40. #endif
  41. #endif
  42. my_string fn_format(my_string to, const char *name, const char *dsk,
  43.     const char *form, int flag)
  44. {
  45.   reg1 uint length;
  46.   char dev[FN_REFLEN], buff[BUFF_LEN], *pos, *startpos;
  47.   const char *ext;
  48.   DBUG_ENTER("fn_format");
  49.   DBUG_PRINT("enter",("name: %s  dsk: %s  form: %s  flag: %d",
  50.        name,dsk,form,flag));
  51. /* Kopiera & skippa enheten */
  52.   name+=(length=dirname_part(dev,(startpos=(my_string) name)));
  53.   if (length == 0 || flag & 1)
  54.   {
  55.     (void) strmake(dev,dsk, sizeof(dev) - 2);
  56.       /* Use given directory */
  57.     convert_dirname(dev); /* Fix to this OS */
  58.   }
  59.   if (flag & 8)
  60.     pack_dirname(dev,dev); /* Put in ./.. and ~/.. */
  61.   if (flag & 4)
  62.     (void) unpack_dirname(dev,dev); /* Replace ~/.. with dir */
  63.   if ((pos=strchr(name,FN_EXTCHAR)) != NullS)
  64.   {
  65.     if ((flag & 2) == 0) /* Skall vi byta extension ? */
  66.     {
  67.       length=strlength(name); /* Old extension */
  68.       ext = "";
  69.     }
  70.     else
  71.     {
  72.       length=(uint) (pos-(char*) name); /* Change extension */
  73.       ext= form;
  74.     }
  75.   }
  76.   else
  77.   {
  78.     length=strlength(name); /* Har ingen ext- tag nya */
  79.     ext=form;
  80.   }
  81.   if (strlen(dev)+length+strlen(ext) >= FN_REFLEN || length >= FN_LEN )
  82.   { /* To long path, return original */
  83.     uint tmp_length;
  84.     if (flag & 64)
  85.       return 0;
  86.     tmp_length=strlength(startpos);
  87.     DBUG_PRINT("error",("dev: '%s'  ext: '%s'  length: %d",dev,ext,length));
  88.     (void) strmake(to,startpos,min(tmp_length,FN_REFLEN-1));
  89.   }
  90.   else
  91.   {
  92.     if (to == startpos)
  93.     {
  94.       bmove(buff,(char*) name,length); /* Save name for last copy */
  95.       name=buff;
  96.     }
  97.     pos=strmake(strmov(to,dev),name,length);
  98. #ifdef FN_UPPER_CASE
  99.     caseup_str(to);
  100. #endif
  101. #ifdef FN_LOWER_CASE
  102.     casedn_str(to);
  103. #endif
  104.     (void) strmov(pos,ext); /* Don't convert extension */
  105.   }
  106.   /* Purify gives a lot of UMR errors when using realpath */
  107. #if defined(HAVE_REALPATH) && !defined(HAVE_purify) && !defined(HAVE_BROKEN_REALPATH)
  108.   if (flag & 16)
  109.   {
  110.     struct stat stat_buff;
  111.     if (flag & 32 || (!lstat(to,&stat_buff) && S_ISLNK(stat_buff.st_mode)))
  112.     {
  113.       if (realpath(to,buff))
  114. strmake(to,buff,FN_REFLEN-1);
  115.     }
  116.   }
  117. #endif
  118.   DBUG_RETURN (to);
  119. } /* fn_format */
  120. /*
  121.   strlength(const string str)
  122.   Return length of string with end-space:s not counted.
  123.   */
  124. size_s strlength(const char *str)
  125. {
  126.   reg1 my_string pos;
  127.   reg2 my_string found;
  128.   DBUG_ENTER("strlength");
  129.   pos=found=(char*) str;
  130.   while (*pos)
  131.   {
  132.     if (*pos != ' ')
  133.     {
  134.       while (*++pos && *pos != ' ') {};
  135.       if (!*pos)
  136.       {
  137. found=pos; /* String ends here */
  138. break;
  139.       }
  140.     }
  141.     found=pos;
  142.     while (*++pos == ' ') {};
  143.   }
  144.   DBUG_RETURN((size_s) (found-(char*) str));
  145. } /* strlength */