//Sample code file: var/ndk/webBuildengine/tmp/viewable_samples/7999585e-fdab-4e7b-b86c-67d55e862138/UniLib.c

//Warning: This code has been marked up for HTML

/***************************************************************************
$name: UniLib.c 
$version: 1.0 
$date_modified: 072902 
$description: Demonstrates using some functions from unilib.h
$owner: NKS Product Manager 
Copyright (c) 2002 Novell, Inc. All Rights Reserved.

THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND TREATIES.
USE AND REDISTRIBUTION OF THIS WORK IS SUBJECT TO THE LICENSE AGREEMENT
ACCOMPANYING THE SOFTWARE DEVELOPMENT KIT (SDK) THAT CONTAINS THIS WORK.
PURSUANT TO THE SDK LICENSE AGREEMENT, NOVELL HEREBY GRANTS TO DEVELOPER A
ROYALTY-FREE, NON-EXCLUSIVE LICENSE TO INCLUDE NOVELL'S SAMPLE CODE IN ITS
PRODUCT. NOVELL GRANTS DEVELOPER WORLDWIDE DISTRIBUTION RIGHTS TO MARKET,
DISTRIBUTE, OR SELL NOVELL'S SAMPLE CODE AS A COMPONENT OF DEVELOPER'S
PRODUCTS. NOVELL SHALL HAVE NO OBLIGATIONS TO DEVELOPER OR DEVELOPER'S
CUSTOMERS WITH RESPECT TO THIS CODE.
****************************************************************************/
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unilib.h>


void   usage(char *pname);
void   printlstring(int count, char *str);
void   printustring(int count, unicode_t *uni);

void usage(char *pname)
{
    fprintf(stderr, "%s  --  a sample program\n", pname);
    fprintf(stderr, "            %s [-option] argument\n", pname);
    fprintf(stderr, "\n");
    fprintf(stderr, "Options:\n");
    fprintf(stderr, "           -v         verbose\n");
    fprintf(stderr, "           -h         this message\n");
    fprintf(stderr, "           -?         this message\n");
    fprintf(stderr, "\n");
}

void printlstring(int count, char *str)
{
   int   i;

   for (i = 0; i < count; i++)
      printf("%02X ", str[i]&0xFF);

   printf("\n");
}

void printustring(int count, unicode_t *uni)
{
   int   i;

   for (i = 0; i < count; i++)
      printf("%04X ", uni[i]);

   printf("\n");
}


int main(int argc, char* argv[])
{
   int            i, err, verbose = FALSE;
   char            *cp, *opt, errstr[256], *utf8, *buf;
   char            sjis[] = { (char)0x83, (char)0x5c, (char)0xbe, (char)0xd0,
                     (char)0x93, (char)0xfa, (char)0x95, (char)0x5c, (char)0 };
   char            asc[] = { (char)0x52, (char)0x77, (char)0x70, (char)0x68,
                     (char)0 };
   size_t         actSize, buflen;
   unicode_t      *uni;
   UniRuleTable_t   table;

   if (argc<2)
   {
      usage(argv[0]);
      return -1;
   }

   // parse out arguments...

   for (i = 1; i < argc; i++)
   {
      cp = argv[i];

      if (*cp == '-')
      {
         cp++;
         opt = cp;

         //fprintf(stdout, "program option %s\n", opt);


         switch (tolower(*opt))
         {
         case 'v':   // verbose mode

            fprintf(stdout, "\tVerbose mode\n");
            verbose = TRUE;
            break;

         case 'h':
         case '?':
            usage(argv[0]);
            return 0;
         }
      }
      else
      {
         fprintf(stdout, "program argument %s\n", argv[i]);
      }
   }

   /*------------------------------------------------------------------------
   **   LibC demo starts here...
   */
   if (err = UniGetTable(932, &table))
   {
      sprintf(errstr, "UniGetTable. err=%d", err);
      goto END_ERR;
   }

   actSize = strlen(sjis) + 1;
   uni     = (unicode_t *) malloc(sizeof(unicode_t) * actSize);
   buflen  = actSize * 5;
   utf8    = (char *) malloc(sizeof(char) * buflen);
   buf     = (char *) malloc(sizeof(char) * buflen);

   /*------------------------------------------------------------------------
   **   locn2uni...
   */
   err = locn2uni(table, uni, &actSize, sjis, strlen(sjis), 0xFF, UNI_MAP_CHAR);

   if (err)
   {
      sprintf(errstr,
        "locn2uni. actSize=%d, unisize=%d, err=%d", actSize, unisize(uni), err);

      if (verbose)
         printustring(actSize, uni);

      goto END_ERR;
   }

   *(uni + actSize) = 0;

   fprintf(stderr, "locn2uni with Shift_JIS ..... OK.\n");

   if (verbose)
   {
      fprintf(stdout, "  From "); printlstring(strlen(sjis), sjis);
      fprintf(stdout, "    To "); printustring(actSize, uni);
   }


   /*------------------------------------------------------------------------
   **   locn2utf8...
   */
   actSize = buflen;

   err = locn2utf8(table, utf8, &actSize, sjis, strlen(sjis), 0xFF,
                                                            UNI_MAP_CHAR);
   if (err)
   {
      sprintf(errstr,
        "locn2utf8. actSize=%d, strlen=%d, err=%d", actSize, strlen(utf8), err);

      if (verbose)
         printlstring(actSize, utf8);

      goto END_ERR;
   }

   fprintf(stderr, "locn2utf8 with Shift_JIS ..... OK.\n");

   if (verbose)
   {
      fprintf(stdout, "  From "); printlstring(strlen(sjis), sjis);
      fprintf(stdout, "    To "); printlstring(actSize, utf8);
   }

   /*------------------------------------------------------------------------
   **   loc2utf8...
   */
   actSize = buflen;

   err = loc2utf8(table, utf8, sjis, 0xFF, UNI_MAP_CHAR);

   if (err)
   {
      sprintf(errstr, "loc2utf8. strlen=%d, err=%d", strlen(utf8), err);

      if (verbose)
         printlstring(strlen(utf8), utf8);

      goto END_ERR;
   }

   fprintf(stderr, "loc2utf8 with Shift_JIS ..... OK.\n");

   if (verbose)
   {
      fprintf(stdout, "  From ");
      printlstring(strlen(sjis), sjis);
      fprintf(stdout, "    To ");
      printlstring(strlen(utf8), utf8);
   }


   /*------------------------------------------------------------------------
   **   uni2utf8...
   */
   err = uni2utf8(utf8, uni);

   if (err)
   {
      sprintf(errstr, "uni2utf8. unisize=%d, err=%d", unilen(uni), err);

      if (verbose)
         printlstring(strlen(utf8), utf8);

      goto END_ERR;
   }

   fprintf(stderr, "uni2utf8 with Shift_JIS ..... OK.\n");

   if (verbose)
   {
      fprintf(stdout, "  From ");
      printustring(unilen(uni), uni);
      fprintf(stdout, "    To ");
      printlstring(strlen(utf8), utf8);
   }


   /*------------------------------------------------------------------------
   **   unin2loc...
   */
   err = unin2loc(table, buf, &buflen, uni, unilen(uni), 0xFF, UNI_MAP_CHAR);

   if (err)
   {
      sprintf(errstr, "unin2loc. unilen=%d, err=%d", unilen(uni), err);

      if (verbose)
         printustring(unilen(uni), uni);

      goto END_ERR;
   }

   fprintf(stderr, "unin2loc with Shift_JIS ..... OK.\n");

   *(buf + buflen) = '\0';

   if (verbose)
   {
      fprintf(stdout, "  From ");
      printustring(unilen(uni), uni);
      fprintf(stdout, "    To ");
      printlstring(strlen(buf), buf);
   }


   /*------------------------------------------------------------------------
   **   asc2uni...
   */
   asc2uni(uni, asc);

   fprintf(stderr, "asc2uni with %s ..... OK.\n", asc);

   if (verbose)
   {
      fprintf(stdout, "  From ");
      printlstring(strlen(asc), asc);
      fprintf(stdout, "    To ");
      printustring(unilen(uni), uni);
   }


   /*------------------------------------------------------------------------
   **   unilen, unisize...
   */
   fprintf(stdout, "unilen(uni) = %d.\n", unilen(uni));
   fprintf(stdout, "unisize(uni) = %d.\n", unisize(uni));

   goto EXIT;


END_ERR:
   fprintf(stderr, "Error... %s\n", errstr);

EXIT:
   if (table)
      UniDisposeTable(table);

   if (utf8)
      free(utf8);

   if (uni)
      free(uni);

   return err;
}