GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: fx_directory_name_extract.c Lines: 22 22 100.0 %
Date: 2024-03-11 05:15:45 Branches: 20 20 100.0 %

Line Branch Exec Source
1
/***************************************************************************
2
 * Copyright (c) 2024 Microsoft Corporation
3
 *
4
 * This program and the accompanying materials are made available under the
5
 * terms of the MIT License which is available at
6
 * https://opensource.org/licenses/MIT.
7
 *
8
 * SPDX-License-Identifier: MIT
9
 **************************************************************************/
10
11
12
/**************************************************************************/
13
/**************************************************************************/
14
/**                                                                       */
15
/** FileX Component                                                       */
16
/**                                                                       */
17
/**   Directory                                                           */
18
/**                                                                       */
19
/**************************************************************************/
20
/**************************************************************************/
21
22
#define FX_SOURCE_CODE
23
24
25
/* Include necessary system files.  */
26
27
#include "fx_api.h"
28
#include "fx_system.h"
29
#include "fx_directory.h"
30
#include "fx_utility.h"
31
32
33
/**************************************************************************/
34
/*                                                                        */
35
/*  FUNCTION                                               RELEASE        */
36
/*                                                                        */
37
/*    _fx_directory_name_extract                          PORTABLE C      */
38
/*                                                           6.1          */
39
/*  AUTHOR                                                                */
40
/*                                                                        */
41
/*    William E. Lamie, Microsoft Corporation                             */
42
/*                                                                        */
43
/*  DESCRIPTION                                                           */
44
/*                                                                        */
45
/*    This function extracts the file name from the supplied input        */
46
/*    string.  If there is nothing left after the extracted name, a NULL  */
47
/*    is returned to the caller.  Otherwise, if something is left, a      */
48
/*    pointer to it is returned.                                          */
49
/*                                                                        */
50
/*  INPUT                                                                 */
51
/*                                                                        */
52
/*    source_ptr                           Source string pointer          */
53
/*    dest_ptr                             Destination string pointer     */
54
/*                                                                        */
55
/*  OUTPUT                                                                */
56
/*                                                                        */
57
/*    Pointer to Next Name                 (if multiple directories)      */
58
/*                                                                        */
59
/*  CALLS                                                                 */
60
/*                                                                        */
61
/*    None                                                                */
62
/*                                                                        */
63
/*  CALLED BY                                                             */
64
/*                                                                        */
65
/*    FileX System Functions                                              */
66
/*                                                                        */
67
/*  RELEASE HISTORY                                                       */
68
/*                                                                        */
69
/*    DATE              NAME                      DESCRIPTION             */
70
/*                                                                        */
71
/*  05-19-2020     William E. Lamie         Initial Version 6.0           */
72
/*  09-30-2020     William E. Lamie         Modified comment(s),          */
73
/*                                            resulting in version 6.1    */
74
/*                                                                        */
75
/**************************************************************************/
76
261818
CHAR  *_fx_directory_name_extract(CHAR *source_ptr, CHAR *dest_ptr)
77
{
78
79
UINT i;
80
81
82
    /* Set the destination string to NULL.  */
83
261818
    dest_ptr[0] = 0;
84
85
    /* Is a backslash present?  */
86

261818
    if ((*source_ptr == '\\') || (*source_ptr == '/'))
87
    {
88
89
        /* Advance the string pointer.  */
90
58666
        source_ptr++;
91
    }
92
93
    /* Loop to remove any leading spaces.  */
94
262026
    while (*source_ptr == ' ')
95
    {
96
97
        /* Position past leading space.  */
98
208
        source_ptr++;
99
    }
100
101
    /* Loop to extract the name.  */
102
261818
    i = 0;
103
2584437
    while (*source_ptr)
104
    {
105
106
        /* If another backslash is present, break the loop.  */
107

2337800
        if ((*source_ptr == '\\') || (*source_ptr == '/'))
108
        {
109
            break;
110
        }
111
112
        /* Long name can be at most 255 characters, but are further limited by the
113
           FX_MAX_LONG_NAME_LEN define.  */
114
2322620
        if (i == FX_MAX_LONG_NAME_LEN - 1)
115
        {
116
1
            break;
117
        }
118
119
        /* Store the character.  */
120
2322619
        dest_ptr[i] =  *source_ptr++;
121
122
        /* Increment the character counter.  */
123
2322619
        i++;
124
    }
125
126
    /* NULL-terminate the string.  */
127
261818
    dest_ptr[i] =  0;
128
129
    /* Determine if we can backup to the previous character.  */
130
261818
    if (i)
131
    {
132
133
        /* Yes, we can move backwards.  */
134
261817
        i--;
135
    }
136
137
    /* Get rid of trailing blanks in the destination string.  */
138
261869
    while (dest_ptr[i] == ' ')
139
    {
140
141
        /* Set this entry to NULL.  */
142
51
        dest_ptr[i] =  0;
143
144
        /* Backup to the next character. Since leading spaces have been removed,
145
           we know that the index is always greater than 1.  */
146
51
        i--;
147
    }
148
149
    /* Determine if the source string is now at the end.  */
150
261818
    if (*source_ptr == 0)
151
    {
152
153
        /* Yes, return a NULL pointer.  */
154
246637
        source_ptr = FX_NULL;
155
    }
156
157
    /* Return the last pointer position in the source.  */
158
261818
    return(source_ptr);
159
}
160