Jump to content

WinPrevChar

From EDM2
Revision as of 04:23, 9 April 2025 by Martini (talk | contribs) (Related Functions)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

This function moves to the previous character in a string.

Syntax

WinPrevChar(hab, ulCodepage, ulCountry, pszStart, pszCurrentChar)

Parameters

hab (HAB) - Input
Anchor-block handle.
ulCodepage (ULONG) - Input
Code page.
If a non-existent code page is specified for ulCodepage, the code page specified by the queue associated with the calling thread is used.
ulCountry (ULONG) - Input
Reserved value, must be 0.
pszStart (PSZ) - Input
Character string that contains pszCurrentChar.
pszCurrentChar (PSZ) - Input
Current character.

Returns

pszPrevChar (PSZ) - returns
Previous character.
The previous character, or the first character if pszCurrentChar is the first character of pszStart.

Remarks

This function handles DBCS strings.

The following is the list of valid code pages:

Canadian-French
863
Desktop Publishing
1004
Iceland
861
Latin 1 Multilingual
850
Latin 2 Multilingual
852
Nordic
865
Portuguese
860
Turkey
857
U.S. (IBM PC)
437

Code page 1004 is compatible with Microsoft Windows.

The following EBCDIC code pages, based on character set 697, are also available for output:

Austrian/German
273
Belgian
500
Brazil
037
Czechoslovakia
870
Danish/Norwegian
277
Finnish/Swedish
278
French
297
Hungary
870
Iceland
871
International
500
Italian
280
Poland
870
Portuguese
037
Spanish
284
Turkey
1026
U.K.-English
285
U.S.-English
037
Yugoslavia
870

Code pages 274 (Belgian) and 282 (Portuguese) can be used to provide access to old data.

The following is the list of valid country codes:

Arabic
785
Australian
61
Belgian
32
Canadian-French
2
Danish
45
Finnish
358
French
33
German
49
Hebrew
972
Italian
39
Japanese
81
Korean
82
Latin-American
3
Netherlands
31
Norwegian
47
Portuguese
351
Simpl. Chinese
86
Spanish
34
Swedish
46
Swiss
41
Trad. Chinese
88
UK-English
44
US-English
1
Other country
0

Errors

Possible returns from WinGetLastError:

  • PMERR_INV_CODEPAGE (0x2052) - An invalid code-page was specified. This error can be obtained if using double-byte character set only.
  • PMERR_INVALID_STRING_PARM (0x100B) - The specified string parameter is invalid.

Example Code

This example uses WinPrevChar to return a pointer to the previous character in a string.

#define INCL_DOSNLS
#define INCL_WINCOUNTRY
#define CURRENT_COUNTRY 0
#include <OS2.H>
#include <stdio.h>

// Assume HIUSHORT is defined if used
#ifndef HIUSHORT
#define HIUSHORT(l) ((USHORT)((l) >> 16))
#endif

int main() // Changed void main() to int main()
{
  HAB hab = NULLHANDLE; /* Anchor-block handle - NOTE: Needs proper initialization via WinInitialize */
  char string[] = "ABCDEFGHIJ";
  char *ptoE = &string[4]; /* Pointer to 'E' */
  char *ptoD;
  ULONG   CodePage;       /* List returned */
  ULONG   DataLength;     /* Length of list returned */
  COUNTRYCODE Country;
  COUNTRYINFO CtryBuffer;

  Country.country = CURRENT_COUNTRY;

  /* NOTE: Error checking for Dos calls is omitted for brevity */
  DosQueryCp( sizeof(CodePage), /* Size of buffer, may need adjustment if expecting list */
              &CodePage,       /* Get code page identifier(s) */
              &DataLength);

  /* First WORD contains the codepage - NOTE: Original logic; DosQueryCp returns a list, HIUSHORT might be wrong here */
  Country.codepage = (ULONG)HIUSHORT(CodePage);

  /* Get the corresponding country code */
  DosQueryCtryInfo( sizeof(CtryBuffer), /* Length of data area     */
                    &Country,       /* Input data structure    */
                    &CtryBuffer,    /* Data area to be filled  */
                    &DataLength);   /* Length of data          */

  /* A pointer should be returned to character 'D' in the string */
  ptoD = WinPrevChar(hab,
                     (ULONG)CodePage, /* NOTE: Using possibly incorrect CodePage value from HIUSHORT */
                     (ULONG)CtryBuffer.country,
                     (PSZ)string,
                     ptoE);           /* Pointer to character 'E' */

  /* Original example only had printf(ptoE); which would print from 'E' onwards */
  /* Example showing pointers returned: */
  printf("Pointer to previous char (ptoD): %p, Pointer to current char (ptoE): %p\n", ptoD, ptoE);

  // WinTerminate(hab); // Should be called if WinInitialize was used
  return 0;
}

Related Functions