Skip to Main Content United States    
PRODUCTS SUPPORT SOLUTIONS SERVICES
COMPAQ SOFTWARE
Compaq C

Compaq C
Run-Time Library Reference Manual for OpenVMS Systems


Previous Contents Index


wcstombs

Converts a sequence of wide-character codes to a sequence of multibyte characters.

Format

#include <stdlib.h>

size_t wcstombs (char *s, const wchar_t *pwcs, size_t n);


Arguments

s

A pointer to the array containing the resulting multibyte characters.

pwcs

A pointer to the array containing the sequence of wide-character codes.

n

The maximum number of bytes to be stored in the array pointed to by s.

Description

This function converts a sequence of codes corresponding to multibyte characters from the array pointed to by pwcs to a sequence of multibyte characters that are stored into the array pointed to by s, up to a maximum of n bytes. The value returned is equal to the number of characters converted or a --1 if an error occurred.

This function is affected by the LC_CTYPE category of the program's current locale. See also wctomb in this section.

If s is NULL, this function call is a counting operation and n is ignored.


Return Values

x The number of bytes stored in s, not including the null terminating byte. If s is NULL, wcstombs returns the number of bytes required for the multibyte character array.
( size_t ) --1 Indicates an error occurred. The function sets errno to EILSEQ -- invalid character sequence, or a wide-character code does not correspond to a valid character.

wcstoul

Converts the initial portion of the wide-character string pointed to by nptr to an unsigned long integer.

Format

#include <wchar.h>

unsigned long int wcstoul (const wchar_t *nptr, wchar_t **endptr, int base);

Function Variants This function also has variants named _wcstoul32 and _wcstoul64 for use with 32-bit and 64-bit pointer sizes, respectively. See Section 1.10 for more information on using pointer-size-specific functions.

Arguments

nptr

A pointer to the wide-character string to be converted to an unsigned long .

endptr

The address of an object where the function can store the address of the first unrecognized character encountered in the conversion process (The character that follows the last character in the string being converted). If endptr is a NULL pointer, the address of the first unrecognized character is not retained.

base

The value, 2 through 36, to use as the base for the conversion.

If base is 16, leading zeros after the optional sign are ignored, and 0x or 0X is ignored.

If base is 0, the sequence of characters is interpreted by the same rules used to interpret an integer constant: after the optional sign, a leading 0 indicates octal conversion, a leading 0x or 0X indicates hexadecimal conversion, and any other combination of leading characters indicates decimal conversion.


Description

This function recognizes strings in various formats, depending on the value of the base. It ignores any leading white-space characters (as defined by the iswspace function) in the string. It recognizes an optional plus or minus sign, then a sequence of digits or letters that may represent an integer constant according to the value of the base. The first unrecognized wide character ends the conversion.

Return Values

x The converted value.
0 Indicates that the string starts with an unrecognized wide character or that the value for base is invalid. If the string starts with an unrecognized wide character, * endptr is set to nptr. The function sets errno to EINVAL.
ULONG_MAX Indicates that the converted value would cause an overflow. The function sets errno to ERANGE.

Example


#include <stdlib.h> 
#include <stdio.h> 
#include <wchar.h> 
#include <errno.h> 
#include <limits.h> 
 
/* This test calls wcstoul() to convert a string to an     */ 
/* unsigned long integer. wcstoul outputs the resulting    */ 
/* integer and any characters that could not be converted. */ 
 
#define MAX_STRING 128 
 
main() 
{ 
 
    int base = 10, 
        errno; 
    char *input_string = "1234.56"; 
    wchar_t string_array[MAX_STRING], 
           *ptr; 
    size_t size; 
    unsigned long int val; 
    printf("base = [%d]\n", base); 
    printf("String to convert = %s\n", input_string); 
    if ((size = mbstowcs(string_array, input_string, MAX_STRING)) == 
 
        (size_t)-1) { 
 
        perror("mbstowcs"); 
        exit(EXIT_FAILURE); 
    } 
    printf("wchar_t string is = [%S]\n", string_array); 
 
    errno = 0; 
    val = wcstoul(string_array, &ptr, base); 
    if (errno == 0) { 
printf("returned unsigned long int from wcstoul = [%u]\n", val); 
      printf("wide char terminating scan(ptr) = [%S]\n\n", ptr); 
    } 
    if (errno == ERANGE) { 
        perror("error value is :"); 
        printf("ULONG_MAX = [%u]\n", ULONG_MAX); 
        printf("wcstoul failed, val = [%d]\n\n", val); 
    } 
 
} 

Running the example program produces the following result:


base = [10] 
String to convert = 1234.56 
wchar_t string is = [1234.56] 
returned unsigned long int from wcstoul = [1234] 
wide char terminating scan(ptr) = [.56] 


wcswcs

Locates the first occurrence in the string pointed to by wstr1 of the sequence of wide characters in the string pointed to by wstr2.

Format

#include <wchar.h>

wchar_t *wcswcs (const wchar_t *wstr1, const wchar_t *wstr2);

Function Variants This function also has variants named _wcswcs32 and _wcswcs64 for use with 32-bit and 64-bit pointer sizes, respectively. See Section 1.10 for more information on using pointer-size-specific functions.

Arguments

wstr1, wstr2

Pointers to null-terminated wide-character strings.

Return Values

Pointer A pointer to the located wide-character string.
NULL Indicates that the wide-character string was not found.

Example


#include <stdlib.h> 
#include <stdio.h> 
#include <wchar.h> 
 
/* This test uses wcswcs() to find the occurrence of each */ 
/* sub wide-character string, string1 and string2, within */ 
/* the main wide-character string, lookin.                */ 
 
#define BUF_SIZE 50 
 
main() 
{ 
  static char lookin[] = "that this is a test was at the end"; 
 
  char string1[] = "this", 
       string2[] = "the end"; 
 
  wchar_t buffer[BUF_SIZE], 
          input_buffer[BUF_SIZE]; 
 
  /* Convert lookin to wide-character format.         */ 
  /* Buffer and print it out.                         */ 
 
 
  if (mbstowcs(buffer, lookin, BUF_SIZE) == (size_t)-1) { 
 
      perror("mbstowcs"); 
      exit(EXIT_FAILURE); 
  } 
 
  printf("Buffer to look in: %S\n", buffer); 
 
  /* Convert string1 to wide-character format and use */ 
  /* wcswcs() to locate it within buffer              */ 
 
 
  if (mbstowcs(input_buffer, string1, BUF_SIZE) == (size_t)-1) { 
 
      perror("mbstowcs"); 
      exit(EXIT_FAILURE); 
  } 
 
  printf("this: %S\n", wcswcs(buffer, input_buffer)); 
 
  /* Convert string2 to wide-character format and use */ 
  /* wcswcs() to locate it within buffer              */ 
 
 
  if (mbstowcs(input_buffer, string2, BUF_SIZE) == (size_t)-1) { 
 
      perror("mbstowcs"); 
      exit(EXIT_FAILURE); 
  } 
  printf("the end: %S\n", wcswcs(buffer, input_buffer)); 
 
  exit(1); 
} 

Running this example produces the following results:


Buffer to look in: that this is a test was at the end 
this: this is a test was at the end 
the end: the end 


wcswidth

Determines the number of printing positions on a display device that are required for a wide-character string.

Format

#include <wchar.h>

int wcswidth (const wchar_t *pwcs, size_t n);


Arguments

pwcs

A pointer to a wide-character string.

n

The maximum number of characters in the string.

Description

This function returns the number of printing positions required to display the first n characters of the string pointed to by pwcs. If there are less than n wide characters in the string, the function returns the number of positions required for the whole string.

Return Values

x The number of printing positions required.
0 If pwcs is a null character.
--1 Indicates that one (or more) of the wide characters in the string pointed to by pwcs is not a printable character.

wcsxfrm

Changes a wide-character string such that the changed string can be passed to the wcscmp function and produce the same result as passing the unchanged string to the wcscoll function.

Format

#include <wchar.h>

size_t wcsxfrm (wchar_t *ws1, const wchar_t *ws2, size_t maxchar);


Arguments

ws1, ws2

Pointers to wide-character strings.

maxchar

The maximum number of wide-characters, including the null wide-character terminator, allowed to be stored in s1.

Description

This function transforms the string pointed to by ws2 and stores the resulting string in the array pointed to by ws1. No more than maxchar wide characters, including the null wide terminator, are placed into the array pointed to by ws1.

If the value of maxchar is less than the required size to store the transformed string (including the terminating null), the contents of the array pointed to by ws1 is indeterminate. In such a case, the function returns the size of the transformed string.

If maxchar is zero, then, ws1 is allowed to be a NULL pointer, and the function returns the required size of the ws1 array before making the transformation.

The wide-character string comparison functions, wcscoll and wcscmp , can produce different results given the same two wide-character strings to compare. This is because wcscmp does a straightforward comparison of the code point values of the characters in the strings, whereas wcscoll uses the locale information to do the comparison. Depending on the locale, the wcscoll comparison can be a multi-pass operation, which is slower than wcscmp .

The wcsxfrm function transforms wide character strings in such a way that if you pass two transformed strings to the wcscmp function, the result is the same as passing the two original strings to the wcscoll function. The wcsxfrm function is useful in applications that need to do a large number of comparisons on the same wide-character strings using wcscoll . In this case, it may be more efficient (depending on the locale) to transform the strings once using wcsxfrm and then use the wcscmp function to do comparisons.


Return Values

x Length of the resulting string pointed to by ws1, not including the terminating null character.
( size_t ) --1 Indicates an error occurred. The function sets errno to EINVAL -- The string pointed to by ws2 contains characters outside the domain of the collating sequence.

Example


#include <wchar.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <locale.h> 
 
/* This program verifies that two transformed strings,    */ 
/* when passed through wcsxfrm and then compared, provide */ 
/* the same result as if passed through wcscoll without   */ 
/* any transformation.                                    */ 
 
#define  BUFF_SIZE  20 
 
main() 
{ 
    wchar_t w_string1[BUFF_SIZE]; 
    wchar_t w_string2[BUFF_SIZE]; 
    wchar_t w_string3[BUFF_SIZE]; 
    wchar_t w_string4[BUFF_SIZE]; 
    int errno; 
    int coll_result; 
    int wcscmp_result; 
    size_t wcsxfrm_result1; 
    size_t wcsxfrm_result2; 
 
    /* setlocale to French locale */ 
 
    if (setlocale(LC_ALL, "fr_FR.ISO8859-1") == NULL) { 
        perror("setlocale"); 
        exit(EXIT_FAILURE); 
    } 
 
    /* Convert each of the strings into wide-character format. */ 
 
 
    if (mbstowcs(w_string1, "<a`>bcd", BUFF_SIZE) == (size_t)-1) { 
 
        perror("mbstowcs"); 
        exit(EXIT_FAILURE); 
    } 
 
 
    if (mbstowcs(w_string2, "abcz", BUFF_SIZE) == (size_t)-1) { 
 
        perror("mbstowcs"); 
        exit(EXIT_FAILURE); 
    } 
 
    /* Collate string 1 and string 2 and store the result. */ 
 
    errno = 0; 
    coll_result = wcscoll(w_string1, w_string2); 
    if (errno) { 
        perror("wcscoll"); 
        exit(EXIT_FAILURE); 
    } 
    else { 
 
       /*  Transform the strings (using wcsxfrm) into  */ 
       /*  w_string3 and w_string4.                    */ 
 
       wcsxfrm_result1 = wcsxfrm(w_string3, w_string1, BUFF_SIZE); 
 
       if (wcsxfrm_result1 == ((size_t) - 1)) 
           perror("wcsxfrm"); 
       else if (wcsxfrm_result1 > BUFF_SIZE) { 
           perror("\n** String is too long **\n"); 
           exit(EXIT_FAILURE); 
       } 
       else { 
          wcsxfrm_result2 = wcsxfrm(w_string4, w_string2, BUFF_SIZE); 
          if (wcsxfrm_result2 == ((size_t) - 1)) { 
              perror("wcsxfrm"); 
              exit(EXIT_FAILURE); 
           } 
          else if (wcsxfrm_result2 > BUFF_SIZE) { 
              perror("\n** String is too long **\n"); 
              exit(EXIT_FAILURE); 
           } 
 
        /* Compare the two transformed strings and verify that  */ 
        /* the result is the same as the result from wcscoll on */ 
        /* the original strings.                                */ 
 
          else { 
              wcscmp_result = wcscmp(w_string3, w_string4); 
              if (wcscmp_result == 0 && (coll_result == 0)) { 
                  printf("\nReturn value from wcscoll() and return value" 
                                       " from wcscmp() are both zero."); 
                  printf("\nThe program was successful\n\n"); 
              } 
              else if ((wcscmp_result < 0) && (coll_result < 0)) { 
                  printf("\nReturn value from wcscoll() and return value" 
                                  " from wcscmp() are less than zero."); 
                  printf("\nThe program was successful\n\n"); 
              } 
              else if ((wcscmp_result > 0) && (coll_result > 0)) { 
                  printf("\nReturn value from wcscoll() and return value" 
                                " from wcscmp() are greater than zero."); 
                  printf("\nThe program was successful\n\n"); 
              } 
              else { 
                  printf("** Error **\n"); 
                  printf("\nReturn values are not of the same type"); 
              } 
           } 
       } 
    } 
} 

Running the example program produces the following result:


Return value from wcscoll() and return value 
       from wcscmp() are less than zero. 
The program was successful 


wctob

Determines if a wide character corresponds to a single-byte multibyte character and returns its multibyte character representation.

Format

#include <stdio.h>

#include <wchar.h>

int wctob (wint_t c);


Arguments

c

The wide character to be converted to a single-byte multibyte character.

Description

This function determines whether the specified wide character corresponds to a single-byte multibyte character when in the initial shift state and, if so, returns its multibyte character representation.

Return Values

x The single-byte representation of the wide character specified.
EOF Indicates an error. The wide character specified does not correspond to a single-byte multibyte character.

wctomb

Converts a wide character to its multibyte character representation.

Format

#include <stdlib.h>

int wctomb (char *s, wchar_t wchar);


Arguments

s

A pointer to the resulting multibyte character.

wchar

The code for the wide character.

Description

This function converts the wide character specified by wchar to its multibyte character representation. If s is NULL, then 0 is returned. Otherwise, the number of bytes comprising the multibyte character is returned. At most, MB_CUR_MAX bytes are stored in the array object pointed to by s.

This function is affected by the LC_CTYPE category of the program's current locale.


Return Values

x The number of bytes comprising the multibyte character corresponding to wchar.
0 If s is NULL.
--1 If wchar is not a valid character.

wctrans

Returns the description of a mapping, corresponding to specified property, that can later be used in a call to towctrans .

Format

#include <wctype.h>

wctrans_t wctrans (const char *property);


Arguments

property

The name of the mapping. The following property names are defined for all locales:
  • "touppper"
  • "tolower"

Additional property names may also be defined in the LC_CTYPE category of the current locale.


Description

This function constructs a value with type wctrans_t that describes a mapping between wide characters identified by the property argument.

See also towctrans in this section.


Return Values

nonzero According to the LC_CTYPE category of the current program locale, the string specified as a property argument is the name of an existing character mapping. The value returned can be used in a call to the towctrans function.
0 Indicates an error. The property argument does not identify a character mapping in the current program's locale.

wctype

Used for defining a character class. The value returned by this function is used in calls to the iswctype function.

Format

#include <wctype.h> (ISO C)

#include <wchar.h> (XPG4)

wctype_t wctype (const char *char_class);


Arguments

char_class

A pointer to a valid character class name.

Description

This function converts a valid character class defined for the current locale to an object of type wctype_t . The following character class names are defined for all locales:


alnum        cntrl        lower        space 
alpha        digit        print        upper 
blank        graph        punct        xdigit 

Additional character class names may also be defined in the LC_CTYPE category of the current locale.

See also iswctype in this section.


Return Values

x An object of type wctype_t that can be used in calls to the iswctype function.
0 If the character class name is not valid for the current locale.

Example


#include <locale.h> 
#include <wchar.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h>                                        
#include <ctype.h> 
 
 
/* This test will set up a number of character class using wctype() */ 
/* and then verify whether calls to iswctype() using these classes  */ 
/* produce the same results as calls to the is**** routines.        */ 
 
main() 
{ 
 
    wchar_t w_char; 
    wctype_t ret_val; 
 
    char *character = "A"; 
 
    /* Convert character to wide character format - w_char */ 
 
    if (mbtowc(&w_char, character, 1) == -1) { 
        perror("mbtowc"); 
        exit(EXIT_FAILURE); 
    } 
 
    /* Check if results from iswalnum() matches check on */ 
    /* alnum character class                             */ 
 
    if ((iswalnum((wint_t) w_char)) && 
        (iswctype((wint_t) w_char, wctype("alnum")))) 
        printf("[%C] is a member of the character class alnum\n", w_char); 
 else 
    printf("[%C] is not a member of the character class alnum\n", w_char); 
 
    /* Check if results from iswalpha() matches check on */ 
    /* alpha character class                             */ 
 
    if ((iswalpha((wint_t) w_char)) && 
        (iswctype((wint_t) w_char, wctype("alpha")))) 
      printf("[%C] is a member of the character class alpha\n", w_char); 
    else 
     printf("[%C] is not a member of the character class alpha\n", w_char); 
 
    /* Check if results from iswcntrl() matches check on */ 
    /* cntrl character class                             */ 
 
    if ((iswcntrl((wint_t) w_char)) && 
        (iswctype((wint_t) w_char, wctype("cntrl")))) 
        printf("[%C] is a member of the character class cntrl\n", w_char); 
    else 
     printf("[%C] is not a member of the character class cntrl\n", w_char); 
 
    /* Check if results from iswdigit() matches check on */ 
    /* digit character class                             */ 
 
    if ((iswdigit((wint_t) w_char)) && 
        (iswctype((wint_t) w_char, wctype("digit")))) 
        printf("[%C] is a member of the character class digit\n", w_char); 
    else 
     printf("[%C] is not a member of the character class digit\n", w_char); 
 
    /* Check if results from iswgraph() matches check on */ 
    /* graph character class                             */ 
 
    if ((iswgraph((wint_t) w_char)) && 
        (iswctype((wint_t) w_char, wctype("graph")))) 
        printf("[%C] is a member of the character class graph\n", w_char); 
    else 
     printf("[%C] is not a member of the character class graph\n", w_char); 
 
    /* Check if results from iswlower() matches check on */ 
    /* lower character class                             */ 
 
    if ((iswlower((wint_t) w_char)) && 
        (iswctype((wint_t) w_char, wctype("lower")))) 
        printf("[%C] is a member of the character class lower\n", w_char); 
    else 
     printf("[%C] is not a member of the character class lower\n", w_char); 
 
    /* Check if results from iswprint() matches check on */ 
    /* print character class                             */ 
 
    if ((iswprint((wint_t) w_char)) && 
        (iswctype((wint_t) w_char, wctype("print")))) 
        printf("[%C] is a member of the character class print\n", w_char); 
    else 
     printf("[%C] is not a member of the character class print\n", w_char); 
 
    /* Check if results from iswpunct() matches check on */ 
    /* punct character class                             */ 
 
    if ((iswpunct((wint_t) w_char)) && 
        (iswctype((wint_t) w_char, wctype("punct")))) 
        printf("[%C] is a member of the character class punct\n", w_char); 
    else 
     printf("[%C] is not a member of the character class punct\n", w_char); 
 
    /* Check if results from iswspace() matches check on */ 
    /* space character class                             */ 
 
    if ((iswspace((wint_t) w_char)) && 
        (iswctype((wint_t) w_char, wctype("space")))) 
        printf("[%C] is a member of the character class space\n", w_char); 
    else 
    printf("[%C] is not a member of the character class space\n", w_char); 
 
    /* Check if results from iswupper() matches check on */ 
    /* upper character class                             */ 
 
    if ((iswupper((wint_t) w_char)) && 
        (iswctype((wint_t) w_char, wctype("upper")))) 
        printf("[%C] is a member of the character class upper\n", w_char); 
    else 
    printf("[%C] is not a member of the character class upper\n", w_char); 
 
    /* Check if results from iswxdigit() matches check on */ 
    /* xdigit character class                             */ 
 
    if ((iswxdigit((wint_t) w_char)) && 
        (iswctype((wint_t) w_char, wctype("xdigit")))) 
        printf("[%C] is a member of the character class xdigit\n", w_char); 
    else 
     printf("[%C] is not a member of the character class xdigit\n", w_char); 
 
}                                                                               


Previous Next Contents Index
Buy Online or Call 1.800.888.0220      privacy statement and legal notices 
STORES CONTACT US SEARCH PRODUCTS SOLUTIONS OPTIONS DEVELOPERS