1
0
mirror of https://github.com/Interlisp/maiko.git synced 2026-01-14 07:30:21 +00:00
Interlisp.maiko/src/codeconv.c

188 lines
4.1 KiB
C

/* $Id: codeconv.c,v 1.3 1999/05/31 23:35:26 sybalsky Exp $ (C) Copyright Venue, All Rights Reserved
*/
/************************************************************************/
/* */
/* (C) Copyright 1989-95 Venue. All Rights Reserved. */
/* Manufactured in the United States of America. */
/* */
/************************************************************************/
#include "version.h"
/*************************************************/
/* NSFatchar string <-> EUC character string */
/* conversion program */
/* file name : char_codes.c */
/* 26,Jun,'89 */
/* 5,Aug,'89 */
/* by Shinichi Miyamoto */
/* 10,Jan,'91 */
/* 27,Feb,'91 */
/* by Sumie Kurihara (FXIS) */
/*************************************************/
#include <stdio.h>
#define EUCMASK 0x80
#define EUCUNMASK 0x7F
#define MASK8BIT 0x00FF
#define TABLESIZE 256
int FatcharNStoEUC(unsigned char *ns_ptr, int ns_len, unsigned char *euc_ptr) {
int i;
int euc_len;
unsigned short ns, euc;
unsigned short ns_euc(short unsigned int ns);
#ifdef DEBUG
unsigned char *ptr;
ptr = euc_ptr;
printf("FatcharNStoEUC start\n");
printf("ns_len = %d\n", ns_len);
for (i = 0; i < ns_len * 2; i++) printf("%x ", ns_ptr[i]);
printf("\n");
#endif
/* ns_len convert to byte count */
ns_len *= 2;
for (i = euc_len = 0; i < ns_len; i += 2) {
ns = *ns_ptr++ * TABLESIZE;
ns += *ns_ptr++;
euc = ns_euc(ns);
if (euc / TABLESIZE) {
/* 16 bit character */
*euc_ptr++ = euc / TABLESIZE;
*euc_ptr++ = euc % TABLESIZE;
euc_len += 2;
} else {
/* ASCII character */
*euc_ptr++ = euc % TABLESIZE;
++euc_len;
}
}
*euc_ptr++ = '\0';
#ifdef DEBUG
printf("FatcharNStoEUC end\n");
printf("euc_len = %d\n", euc_len);
for (i = 0; i < euc_len; i++) printf("%x ", ptr[i]);
printf("\n");
#endif
return (euc_len);
}
int ThincharNStoEUC(unsigned char *ns_ptr, int ns_len, unsigned char *euc_ptr) {
int i;
int euc_len = 0;
unsigned short ns, euc;
unsigned short ns_euc(short unsigned int ns);
#ifdef DEBUG
unsigned char *ptr;
ptr = euc_ptr;
printf("ThincharNStoEUC start\n");
printf("ns_len = %d\n", ns_len);
for (i = 0; i < ns_len; i++) printf("%x ", ns_ptr[i]);
printf("\n");
#endif
/* ns_len convert to byte count */
for (i = euc_len = 0; i < ns_len; i++) {
ns = *ns_ptr++;
euc = ns_euc(ns);
if (euc / TABLESIZE) {
/* 16 bit character */
*euc_ptr++ = euc / TABLESIZE;
*euc_ptr++ = euc % TABLESIZE;
euc_len += 2;
} else {
/* ASCII character */
*euc_ptr++ = euc % TABLESIZE;
++euc_len;
}
}
*euc_ptr++ = '\0';
#ifdef DEBUG
printf("ThincharNStoEUC end\n");
printf("euc_len = %d\n", euc_len);
for (i = 0; i < euc_len; i++) printf("%x ", ptr[i]);
printf("\n");
#endif
return (euc_len);
}
int EUCtoFatcharNS(unsigned char *euc_ptr, unsigned char *ns_ptr) {
int i;
int ns_len;
unsigned short euc, ns;
unsigned short euc_ns(short unsigned int euc);
#ifdef DEBUG
printf("EUCtoFatcharNS start\n");
for (i = 0; i < strlen(euc_ptr); i++) printf("%x ", euc_ptr[i]);
printf("\n");
#endif
i = 0;
while (euc = *euc_ptr++) {
if (euc & EUCMASK) {
/* 16 bit character */
euc *= TABLESIZE;
euc += *euc_ptr++;
}
ns = euc_ns(euc);
ns_ptr[i++] = ns / TABLESIZE;
ns_ptr[i++] = ns % TABLESIZE;
}
ns_len = i / 2;
#ifdef DEBUG
printf("EUCtoFatcharNS end\n");
printf("ns_len = %d\n", ns_len);
for (i = 0; i < ns_len * 2; i++) printf("%x ", ns_ptr[i]);
printf("\n");
#endif
return (ns_len);
}
int EUCstrlen(char *euc_ptr) {
int len = 0;
#ifdef DEBUG
int i;
printf("EUCstrlen start\n");
for (i = 0; i < strlen(euc_ptr); i++) printf("%x ", euc_ptr[i]);
printf("\n");
#endif
while (*euc_ptr)
if (*euc_ptr & EUCMASK) {
/* 16 bit character */
len += 2;
*euc_ptr++;
*euc_ptr++;
} else {
/* ASCII character */
len++;
*euc_ptr++;
}
#ifdef DEBUG
printf("EUCstrlen end\n");
printf("len = %d\n", len);
#endif
return (len);
}