56   unsigned starting_codept;      
 
   57   unsigned cho_start,  cho_end;  
 
   58   unsigned jung_start, jung_end; 
 
   59   unsigned jong_start, jong_end; 
 
   69main (
int argc, 
char *argv[]) {
 
   74   unsigned glyph[MAX_GLYPHS][16];
 
   75   unsigned tmp_glyph [16];  
 
   79   struct PARAMS params = { 0xAC00,  
 
   97                       unsigned cho, 
unsigned jung, 
unsigned jong,
 
   98                       unsigned *combined_glyph);
 
  106               "Range: (U+%04X, U+%04X, U+%04X) to (U+%04X, U+%04X, U+%04X)\n",
 
  107               params.cho_start, params.jung_start, params.jong_start,
 
  108               params.cho_end,   params.jung_end,   params.jong_end);
 
  115   for (codept = 0; codept < MAX_GLYPHS; codept++) {
 
  116      for (i = 0; i < 16; i++) glyph[codept][i] = 0x0000;
 
  123   if (max_codept > 0x8FF) {
 
  124      fprintf (stderr, 
"\nWARNING: Hangul glyph range exceeds PUA space.\n\n");
 
  127   codept = params.starting_codept;  
 
  129   for (cho = params.cho_start; cho <= params.cho_end; cho++) {
 
  130      for (jung = params.jung_start; jung <= params.jung_end; jung++) {
 
  131         for (jong = params.jong_start; jong <= params.jong_end; jong++) {
 
  134            fprintf (params.outfp,
 
  135                     "(U+%04X, U+%04X, U+%04X)\n",
 
  151   if (params.infp  != stdin)  fclose (params.infp);
 
  152   if (params.outfp != stdout) fclose (params.outfp);
 
  166   void get_hex_range (
char *instring, 
unsigned *start, 
unsigned *end);
 
  168   int strncmp (
const char *s1, 
const char *s2, 
size_t n);
 
  173   while (arg_count < argc) {
 
  175      if (strncmp (argv [arg_count], 
"-all", 4) == 0) {
 
  176         params->starting_codept = 0x0001;
 
  185      else if (strncmp (argv [arg_count], 
"-c", 2) == 0) {
 
  187         if (arg_count < argc) {
 
  188            sscanf (argv [arg_count], 
"%X", ¶ms->starting_codept);
 
  192      else if (strncmp (argv [arg_count], 
"-j1", 3) == 0) {
 
  194         if (arg_count < argc) {
 
  196                           ¶ms->cho_start, ¶ms->cho_end);
 
  221      else if (strncmp (argv [arg_count], 
"-j2", 3) == 0) {
 
  223         if (arg_count < argc) {
 
  225                           ¶ms->jung_start, ¶ms->jung_end);
 
  250      else if (strncmp (argv [arg_count], 
"-j3", 3) == 0) {
 
  252         if (arg_count < argc) {
 
  254                           ¶ms->jong_start, ¶ms->jong_end);
 
  279      else if (strncmp (argv [arg_count], 
"-i", 2) == 0) {
 
  281         if (arg_count < argc) {
 
  282            params->infp = fopen (argv [arg_count], 
"r");
 
  283            if (params->infp == NULL) {
 
  284               fprintf (stderr, 
"\n*** ERROR: Cannot open %s for input.\n\n",
 
  291      else if (strncmp (argv [arg_count], 
"-o", 2) == 0) {
 
  293         if (arg_count < argc) {
 
  294            params->outfp = fopen (argv [arg_count], 
"w");
 
  295            if (params->outfp == NULL) {
 
  296               fprintf (stderr, 
"\n*** ERROR: Cannot open %s for output.\n\n",
 
  303      else if (strncmp (argv [arg_count], 
"-h",     2) == 0 ||
 
  304               strncmp (argv [arg_count], 
"--help", 6) == 0) {
 
  305         printf (
"\nunigen-hangul [options]\n\n");
 
  306         printf (
"     Generates Hangul syllables from an input Unifont .hex file encoded\n");
 
  307         printf (
"     in Johab 6/3/1 format.  By default, the output is the Unicode Hangul\n");
 
  308         printf (
"     Syllables range, U+AC00..U+D7A3.  Options allow the user to specify\n");
 
  309         printf (
"     a starting code point for the output Unifont .hex file, and ranges\n");
 
  310         printf (
"     in hexadecimal of the starting and ending Hangul Jamo code points:\n\n");
 
  312         printf (
"          * 1100-115E Initial consonants (choseong)\n");
 
  313         printf (
"          * 1161-11A7 Medial vowels (jungseong)\n");
 
  314         printf (
"          * 11A8-11FF Final consonants (jongseong).\n\n");
 
  316         printf (
"     A single code point or 0 to omit can be specified instead of a range.\n\n");
 
  318         printf (
"   Option    Parameters    Function\n");
 
  319         printf (
"   ------    ----------    --------\n");
 
  320         printf (
"   -h, --help              Print this message and exit.\n\n");
 
  321         printf (
"   -all                    Generate all Hangul syllables, using all modern and\n");
 
  322         printf (
"                           ancient Hangul in the Unicode range U+1100..U+11FF,\n");
 
  323         printf (
"                           U+A960..U+A97C, and U+D7B0..U+D7FB.\n");
 
  324         printf (
"                           WARNING: this will generate over 1,600,000 syllables\n");
 
  325         printf (
"                           in a 115 megabyte Unifont .hex format file.  The\n");
 
  326         printf (
"                           default is to only output modern Hangul syllables.\n\n");
 
  327         printf (
"   -c        code_point    Starting code point in hexadecimal for output file.\n\n");
 
  328         printf (
"   -j1       start-end     Choseong (jamo 1) start-end range in hexadecimal.\n\n");
 
  329         printf (
"   -j2       start-end     Jungseong (jamo 2) start-end range in hexadecimal.\n\n");
 
  330         printf (
"   -j3       start-end     Jongseong (jamo 3) start-end range in hexadecimal.\n\n");
 
  331         printf (
"   -i        input_file    Unifont hangul-base.hex formatted input file.\n\n");
 
  332         printf (
"   -o        output_file   Unifont .hex format output file.\n\n");
 
  333         printf (
"      Example:\n\n");
 
  334         printf (
"         unigen-hangul -c 1 -j3 11AB-11AB -i hangul-base.hex -o nieun-only.hex\n\n");
 
  335         printf (
"      Generates Hangul syllables using all modern choseong and jungseong,\n");
 
  336         printf (
"      and only the jongseong nieun (Unicode code point U+11AB).  The output\n");
 
  337         printf (
"      Unifont .hex file will contain code points starting at 1.  Instead of\n");
 
  338         printf (
"      specifying \"-j3 11AB-11AB\", simply using \"-j3 11AB\" will also suffice.\n\n");
 
  359   sscanf (instring, 
"%X", start);
 
  361        instring [i] != 
'\0' && instring [i] != 
'-';
 
  364   if (instring [i] == 
'-') {
 
  366      sscanf (&instring [i], 
"%X", end);
 
Define constants and function prototypes for using Hangul glyphs.
void print_glyph_hex(FILE *fp, unsigned codept, unsigned *this_glyph)
Print one glyph in Unifont hexdraw hexadecimal string style.
void combined_jamo(unsigned glyph_table[MAX_GLYPHS][16], unsigned cho, unsigned jung, unsigned jong, unsigned *combined_glyph)
Convert Hangul Jamo choseong, jungseong, and jongseong into a glyph.
#define CHO_UNICODE_START
Modern Hangul choseong start.
#define JONG_UNICODE_END
Modern Hangul jongseong end.
#define JUNG_EXTB_UNICODE_START
Hangul Extended-B jungseong start.
#define JONG_EXTB_UNICODE_END
Hangul Extended-B jongseong end.
#define CHO_EXTA_UNICODE_START
Hangul Extended-A choseong start.
#define JONG_UNICODE_START
Modern Hangul jongseong start.
#define CHO_UNICODE_END
Hangul Jamo choseong end.
#define CHO_EXTA_UNICODE_END
Hangul Extended-A choseong end.
#define JUNG_UNICODE_START
Modern Hangul jungseong start.
#define JONG_EXTB_UNICODE_START
Hangul Extended-B jongseong start.
#define JUNG_UNICODE_END
Modern Hangul jungseong end.
unsigned hangul_read_base16(FILE *infp, unsigned base[][16])
Read hangul-base.hex file into a unsigned array.
#define JUNG_EXTB_UNICODE_END
Hangul Extended-B jungseong end.
int main()
The main function.
void get_hex_range(char *instring, unsigned *start, unsigned *end)
Scan a hexadecimal range from a character string.
void parse_args(int argc, char *argv[], struct PARAMS *params)
Parse command line arguments.