fnsplit.c

来自「国外网站上的一些精典的C程序」· C语言 代码 · 共 269 行

C
269
字号
/************************************************************************//*                                                                      *//*  FNSPLIT.C                                                           *//*                                                                      *//*  Contains routines for parsing file/path names.                      *//*                                                                      *//*  Original Copyright 1989-96 by Robert B. Stout as part of            *//*  the MicroFirm Function Library (MFL)                                *//*                                                                      *//*  The user is granted a free limited license to use this source file  *//*  to create royalty-free programs, subject to the terms of the        *//*  license restrictions specified in the LICENSE.MFL file.             *//*                                                                      *//************************************************************************/#include <string.h>#include <stdlib.h>#include "filnames.h"/******************************************************************//*                                                                *//*  has_wild()                                                    *//*                                                                *//*  Checks a string for wildcard characters ('?' and '*')         *//*                                                                *//*  Arguments 1 - String to check                                 *//*                                                                *//*  Returns: True_ if string contains wildcards, else False_      *//*                                                                *//*  Side Effects: None                                            *//*                                                                *//******************************************************************/Boolean_T has_wild(char *pname){      if (NULL != strchr(pname, '*') || NULL != strchr(pname, '?'))            return True_;      else  return False_;}/******************************************************************//*                                                                *//*  fnSplit()                                                     *//*                                                                *//*  Splits file specifications into component parts. Similar to   *//*  compiler-specific fnsplit() or _splitpath().                  *//*                                                                *//*  Arguments 1 - Original file specification                     *//*            2 - Buffer to receive drive spec                    *//*            3 - Buffer to receive drive/path spec               *//*            4 - Buffer to receive path spec                     *//*            5 - Buffer to receive name.ext spec                 *//*            6 - Buffer to receive name spec                     *//*            7 - Buffer to receive ext spec                      *//*                                                                *//*  Returns: Bit map as follows (see defines in RBS.H):           *//*           Extension_ - File spec included extension            *//*           Filename_  - File spec did not end in '\'            *//*           Directory_ - File spec included a path               *//*           Drive_     - File spec included a drive spec         *//*           Wildname_  - File name included wildcards (*.?)      *//*           Wildpath_  - File path included wildcards (*.?)      *//*                                                                *//*  Side Effects: Calls dos2unix() to convert '\' to '/'          *//*                                                                *//*  Notes: Passing NULL in arguments 2-7 causes fnsplit() to      *//*         not save the corresponding portion of the path.        *//*                                                                *//******************************************************************/int fnSplit(char *spec,             /* Original file spec         */            char *drive,            /* Drive spec                 */            char *pname,            /* Path w/ drive spec         */            char *path,             /* Path spec                  */            char *fname,            /* File name + extension      */            char *name,             /* File name                  */            char *ext)              /* File extension             */{      int ret_code = 0;      char *d = spec, *p, *e;      dos2unix(spec);      if (':' == spec[1])      {            if (drive)                  strncpy(drive, spec, 2);            drive[2] = NUL;            d += 2;            ret_code |= Drive_;      }      else      {            if (drive)                  *drive = NUL;      }      if (NULL != (p = strrchr(d, '/')))      {            char ch;            ch = *(++p);            *p = NUL;            if (path)                  strcpy(path, d);            if (pname)                  strcpy(pname, spec);            if (has_wild(d))                  ret_code |= Wildpath_;            *p = ch;            ret_code |= Directory_;      }      else      {            if (path)                  *path = NUL;            if (pname)            {                  if (drive)                        strcpy(pname, drive);                  else  *pname = NUL;            }            p = d;            if ('.' == *p)            {                  size_t dot_length;                  ret_code |= Directory_;                  for (dot_length = 0; '.' == p[dot_length]; ++dot_length)                        ;                  if (path)                  {                        strncat(path, p, dot_length);                        strcat(path, "\\");                  }                  if (pname)                  {                        strncat(pname, p, dot_length);                        strcat(pname, "\\");                  }                  if (fname)                        *fname = NUL;                  if (name)                        *name  = NUL;                  if (ext)                        *ext   = NUL;                  return ret_code;            }      }      if (fname)            strcpy (fname, p);      if (has_wild(p))            ret_code |= Wildname_;      if (*p)            ret_code |= Filename_;      if (NULL != (e = strrchr(p, '.')))      {            *e = NUL;            if (name)                  strcpy(name, p);            *e = '.';            if (ext)                  strcpy(ext, e);            ret_code |= Extension_;      }      else      {            if (name)                  strcpy(name,p);            if (ext)                  *ext = NUL;      }      return ret_code;}/******************************************************************//*                                                                *//*  fnMerge()                                                     *//*                                                                *//*  Creates file specification from component parts. Similar to   *//*  compiler-specific fnmerge() or _makepath().                   *//*                                                                *//*  Arguments 1 - Buffer to receive file specification            *//*            2 - drive specification                             *//*            3 - drive/path specification                        *//*            4 - path specification                              *//*            5 - name.ext specification                          *//*            6 - name specification                              *//*            7 - ext specification                               *//*                                                                *//*  Returns: Reassembled name                                     *//*                                                                *//*  Side Effects: None                                            *//*                                                                *//******************************************************************/char *fnMerge(char *spec,                 /* File spec buffer     */              char *drive,                /* Drive spec           */              char *pname,                /* Path w/ drive spec   */              char *path,                 /* Path spec            */              char *fname,                /* File name + extension*/              char *name,                 /* File name            */              char *ext)                  /* File extension       */{      *spec = NUL;      if (pname && *pname)            strcpy(spec, pname);      else      {            if (drive && *drive)                  strcpy(spec, drive);            if (path && *path)                  strcpy(spec, path);      }      dos2unix(spec);      if (*spec && '/' != LAST_CHAR(spec) && (':' != LAST_CHAR(spec)))            strcat(spec, "/");      if (fname && *fname)            strcat(spec, fname);      else      {            if (name && *name)                  strcat(spec, name);            else  return spec;            if (ext && *ext)            {                  if ('.' != *ext)                        strcat(spec, ".");                  strcat(spec, ext);            }      }//      return strupr(spec);}#ifdef TEST#include <stdio.h>main(int argc, char *argv[]){      char pname[FILENAME_MAX], drive[3], path[FILENAME_MAX];      char fname[13], name[9], ext[4], fullname[FILENAME_MAX];      if (2 > argc)      {            puts("\aUsage: FNSTST [d:][path{\\|/}][file][.ext]");            abort();      }      printf("fnSplit(%s) returned \n", argv[1]);      printf("%02Xh\n",            fnSplit(argv[1], drive, pname, path, fname, name, ext));      printf("drive: %s\n", drive);      printf("pname: %s\n", pname);      printf("path : %s\n", path);      printf("fname: %s\n", fname);      printf("name : %s\n", name);      printf("ext  : %s\n", ext);      printf("\nCalling fnMerge() to reassemble everything returned %s\n",             fnMerge(fullname, drive, pname, path, fname, name, ext));}#endif /* TEST */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?