summaryrefslogblamecommitdiffstats
path: root/private/os2/client/dlldbcs.c
blob: 5beaf6f43f240419e97dd7d173ddf4ffba7cd4b4 (plain) (tree)


































































































































































                                                                       
/*++

Copyright (c) 1993  Microsoft Corporation

Module Name:

    dlldbcs.c

Abstract:

    This module contains the multibyte string functions.

Author:

    Akihiko Sasaki (V-AkihiS) 23-June-1993

Revision History:

--*/

#ifdef DBCS

#include "os2dll.h"
#include "dlldbcs.h"
#include "conrqust.h"
#include "os2win.h"


unsigned char * _CRTAPI1 
Od2MultiByteStrchr(
    const unsigned char *string, 
    unsigned short c
    )
{
    const unsigned char ch = (unsigned char)c;

    while (*string != ch) {
        if (Ow2NlsIsDBCSLeadByte(*string, SesGrp->DosCP)) {
            string++;
        }
        if (*string == '\0')
            return NULL;
        string++;
    }
    return (unsigned char *)string;
}

unsigned char * _CRTAPI1
Od2MultiByteStrrchr(
    const unsigned char *string, 
    unsigned short c
    )
{
    const unsigned char ch = (unsigned char)c;
    const unsigned char *lastoccurence = NULL;

    while (1) {
        if (Ow2NlsIsDBCSLeadByte(*string, SesGrp->DosCP)) {
            string++;
        } else {
            if (*string == ch)
                lastoccurence = string;
        }
        if (*string == '\0')
            return (unsigned char *)lastoccurence;
        string++;
    }
}

unsigned char * _CRTAPI1
Od2MultiByteStrstr(
    const unsigned char *string1, 
    const unsigned char *string2
    )
{
    if (*string2 == '\0')
        return (unsigned char *)string1;
    while((string1 = Od2MultiByteStrchr(string1, *string2)) != NULL) {
        const unsigned char *substring1 = string1;
        const unsigned char *substring2 = string2;

        while (1) {
            if (Ow2NlsIsDBCSLeadByte(*substring1, SesGrp->DosCP)) {
                if (Ow2NlsIsDBCSLeadByte(*substring2, SesGrp->DosCP)) {
                    if (*substring1++ == *substring2++) {
                        if (*substring2 == '\0')
                            if (*substring1 == '\0')
                                return (unsigned char *)string1;
                            else 
                                return NULL;
                        else if (*substring1++ != *substring2++)
                            break;
                    } else {
                        if (*substring1 == '\0' || *substring2 == '\0')
                            return NULL;
                        substring1 +=2;
                        substring2 +=2;
                    }
                } else {
                    if (*substring2 == '\0') {
                        return (unsigned char *)string1;
                    } else {
                        substring1++;
                        if (*substring1 == '\0')
                            return NULL;
                        substring1++;
                        substring2++;
                    }
                }
            } else {
                if (Ow2NlsIsDBCSLeadByte(*substring2, SesGrp->DosCP)) {
                    if (*substring1 == '\0') {
                        return NULL;
                    } else {
                        substring2++;
                        if (*substring2 == '\0')
                            return NULL;
                        substring1++;
                        substring2++;
                    }

                } else {
                    if (*substring2 == '\0')
                        return (unsigned char *)string1;
                    else if (*substring1 == '\0')
                        return NULL;
                    else if (*substring1++ != *substring2++) 
                        break;
                }
            }
        }
        string1++;
    }
    return NULL;    
}

unsigned char * _CRTAPI1
Od2MultiByteStrpbrk(
    const unsigned char *string1, 
    const unsigned char *string2
    )
{
    const unsigned char *substring1, *substring2;
        
    substring1 = string1;
    while (*substring1 != '\0') {
        substring2 = string2;
        if (Ow2NlsIsDBCSLeadByte(*substring1, SesGrp->DosCP)) {
            substring1++;
            if (*substring1 == '\0')
                return NULL;
        } else {
            while (*substring2 != '\0') {
                if (*substring1 == *substring2) 
                    return (unsigned char *)substring1;
	        substring2++;
            }
        }
        substring1++;
    }
    return NULL;
}
#endif