blob: f85c45946e9b93e0c3654e2c0e94226d928573aa [file] [log] [blame]
/*
*******************************************************************************
*
* Copyright (C) 2000, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
* file name: lineargb.c
* encoding: US-ASCII
* tab size: 8 (not used)
* indentation:4
*
* created on: 2000oct03
* created by: Markus W. Scherer
*
* This tool operates on 4-byte GB 18030 codepage sequences. It can
* - calculate the linear value of such a sequence, with the lowest one,
* 81 30 81 30, getting value 0
* - calculate the linear difference between two sequences
* - calculate a sequence that is linearly offset from another
*
* To compile, just call a C compiler/linker with this source file.
* On Windows: cl lineargb.c
*/
#include <stdio.h>
#include <stdlib.h>
#define LINEAR_18030(a, b, c, d) ((((a)*10+(b))*126L+(c))*10L+(d))
#define LINEAR_18030_BASE LINEAR_18030(0x81, 0x30, 0x81, 0x30)
static long
getLinear(const char *argv[]) {
unsigned int a, b, c, d;
a=(unsigned int)strtoul(argv[0], NULL, 16);
b=(unsigned int)strtoul(argv[1], NULL, 16);
c=(unsigned int)strtoul(argv[2], NULL, 16);
d=(unsigned int)strtoul(argv[3], NULL, 16);
return LINEAR_18030(a, b, c, d);
}
extern int
main(int argc, const char *argv[]) {
if(argc==5) {
printf("Linear value: %ld\n", getLinear(argv+1)-LINEAR_18030_BASE);
return 0;
} else if(argc==6) {
int a, b, c, d;
long linear=getLinear(argv+1)-LINEAR_18030_BASE+strtoul(argv[5], NULL, 0);
d=(int)(0x30+linear%10); linear/=10;
c=(int)(0x81+linear%126); linear/=126;
b=(int)(0x30+linear%10); linear/=10;
a=(int)(0x81+linear);
printf("Offset byte sequence: 0x%02x 0x%02x 0x%02x 0x%02x\n",
a, b, c, d);
return 0;
} else if(argc==9) {
printf("Linear difference: %ld\n", getLinear(argv+5)-getLinear(argv+1));
return 0;
} else {
printf("Usage: %s a b c d [offset | e f g h] calculates with hexadecimal GB 18030 byte values.\n"
"Just one sequence: prints linear value.\n"
"Two sequences: prints the linear difference.\n"
"One sequence and an offset (decimal or with 0x): prints offset byte sequence\n",
argv[0]);
return 1;
}
}