Professional Software Consulting

countFieldsMB()

The countFieldsMB function.

Example Usage
char *cpLine = "v&&&second&&&third&&&fourth&&&fifth&&&&&&seventh&&&&&&ninth";
char *cpDelim = "&&&";
char cRv;

cRv = countFieldsMB(cpLine, strlen(cpLine), cpDelim, strlen(cpDelim), TRUE);
/*
* Returns 9 (includes empty fields)
*/

cRv = countFieldsMB(cpLine, strlen(cpLine), cpDelim, strlen(cpDelim), FALSE);
/*
* Returns 7 (two empty fields are ignored)
*/


Source Code
/**
* Copyright (c) 2008, Corey's Consulting LLC.  All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
*   this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
*   notice, this list of conditions and the following disclaimer in the
*   documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/******************************************************************************

 countFieldsMB()

 This function is designed to scan a buffer and count the number of fields
 in the buffer given a (potentially) multi-byte delimiter.

 Parameters:
    cpLine          - i:line containing fields, needn't be null terminated
    iLenLine        - i:length of cpLine
    cpDelim         - i:field delimiter to use
    iLenDelim       - i:length of cpDelim
    cIncludeEmpty   - i:BOOL: TRUE=count empty fields as valid, FALSE=don't

 Returns:
    0+ : number of fields detected (0 means empty buffer)
    GF_xxx : see header file

****/
char
countFieldsMB(char *cpLine, int iLenLine, char *cpDelim, int iLenDelim,
        char cIncludeEmpty)
{
char    cRetVal = 0;
int     iFieldCount;
char    *cpStart;
char    *cpNextDlm;
int     iLenRemaining;
int     iLenField;


    for(;;)        /* enables single exit point */
    {


// check parms

        if ((cpLine == NULL) || (cpDelim == NULL))
        {
            cRetVal = GF_NULL_PARAM;
            break;
        }


        if (iLenDelim < 1 || iLenLine < 0)
        {
            cRetVal = GF_INVALID_PARMS;
            break;
        }



// easy stuff first

        if (iLenLine == 0)
        {
            // no fields
            cRetVal = 0;
            break;
        }


// count the fields

        cpStart = cpLine;
        iLenRemaining = iLenLine;
        iFieldCount = 0;

        for (;;)    // not endless because memStr will eventually fail
        {
            if (iLenDelim == 1)
            {
                // use faster version if single byte delimiter
                cpNextDlm = (char *)memchr(cpStart, cpDelim[0], iLenRemaining);
            }
            else
            {
                cpNextDlm = utl_memStr(cpStart, iLenRemaining,
                        cpDelim, iLenDelim);
            }


            if (cpNextDlm == NULL)
            {
                // no more fields, must account for final field
                if (iLenRemaining == 0)
                {
                    if (cIncludeEmpty)
                    {
                        ++iFieldCount;
                    }
                    // else do nothing, empty field
                }
                else
                {
                    // field has length; count it
                    ++iFieldCount;
                }

                break;
            }
            else
            {
                // delimiter detected, increment field count

                iLenField = (int)(cpNextDlm - cpStart);
                iLenRemaining -= iLenField;
                iLenRemaining -= iLenDelim;
                cpStart = cpNextDlm + iLenDelim;

                if (iLenField == 0)
                {
                    // empty field detected

                    if (cIncludeEmpty)
                    {
                        ++iFieldCount;
                    }
                    // else do nothing, empty field
                }
                else
                {
                    // field has length; count it
                    ++iFieldCount;
                }
            }
        }


        cRetVal = iFieldCount;


        if (1==1)
            break;
    }   /* end single exit point "for" */



    return(cRetVal);
}    // end countFieldsMB()

     Contact Us     

Something wrong with this page or this site? Let the webmaster know by clicking HERE
This website designed, implemented, and maintained by Corey Dulecki
© 2009-2012, Corey's Consulting LLC