|
Packit Service |
a721b1 |
/* mtext-lbrk.c -- line break
|
|
Packit Service |
a721b1 |
Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
|
|
Packit Service |
a721b1 |
National Institute of Advanced Industrial Science and Technology (AIST)
|
|
Packit Service |
a721b1 |
Registration Number H15PRO112
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
This file is part of the m17n library.
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
The m17n library is free software; you can redistribute it and/or
|
|
Packit Service |
a721b1 |
modify it under the terms of the GNU Lesser General Public License
|
|
Packit Service |
a721b1 |
as published by the Free Software Foundation; either version 2.1 of
|
|
Packit Service |
a721b1 |
the License, or (at your option) any later version.
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
The m17n library is distributed in the hope that it will be useful,
|
|
Packit Service |
a721b1 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
a721b1 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit Service |
a721b1 |
Lesser General Public License for more details.
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
You should have received a copy of the GNU Lesser General Public
|
|
Packit Service |
a721b1 |
License along with the m17n library; if not, write to the Free
|
|
Packit Service |
a721b1 |
Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
Packit Service |
a721b1 |
Boston, MA 02110-1301 USA. */
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
#if !defined (FOR_DOXYGEN) || defined (DOXYGEN_INTERNAL_MODULE)
|
|
Packit Service |
a721b1 |
/*** @addtogroup m17nInternal
|
|
Packit Service |
a721b1 |
@{ */
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
#include <stdio.h>
|
|
Packit Service |
a721b1 |
#include <stdlib.h>
|
|
Packit Service |
a721b1 |
#include <string.h>
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
#include "config.h"
|
|
Packit Service |
a721b1 |
#include "m17n.h"
|
|
Packit Service |
a721b1 |
#include "m17n-misc.h"
|
|
Packit Service |
a721b1 |
#include "internal.h"
|
|
Packit Service |
a721b1 |
#include "mtext.h"
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
enum LineBreakClass
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
LBC_OP, /* open */
|
|
Packit Service |
a721b1 |
LBC_CL, /* close */
|
|
Packit Service |
a721b1 |
LBC_QU, /* quotation */
|
|
Packit Service |
a721b1 |
LBC_GL, /* glue */
|
|
Packit Service |
a721b1 |
LBC_NS, /* no-start */
|
|
Packit Service |
a721b1 |
LBC_EX, /* exclamation/interrogation */
|
|
Packit Service |
a721b1 |
LBC_SY, /* Syntax (slash) */
|
|
Packit Service |
a721b1 |
LBC_IS, /* infix (numeric) separator */
|
|
Packit Service |
a721b1 |
LBC_PR, /* prefix */
|
|
Packit Service |
a721b1 |
LBC_PO, /* postfix */
|
|
Packit Service |
a721b1 |
LBC_NU, /* numeric */
|
|
Packit Service |
a721b1 |
LBC_AL, /* alphabetic */
|
|
Packit Service |
a721b1 |
LBC_ID, /* ideograph (atomic) */
|
|
Packit Service |
a721b1 |
LBC_IN, /* inseparable */
|
|
Packit Service |
a721b1 |
LBC_HY, /* hyphen */
|
|
Packit Service |
a721b1 |
LBC_BA, /* break after */
|
|
Packit Service |
a721b1 |
LBC_BB, /* break before */
|
|
Packit Service |
a721b1 |
LBC_B2, /* break both */
|
|
Packit Service |
a721b1 |
LBC_ZW, /* ZW space */
|
|
Packit Service |
a721b1 |
LBC_CM, /* combining mark */
|
|
Packit Service |
a721b1 |
LBC_WJ, /* word joiner */
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
/* used for 4.1 pair table */
|
|
Packit Service |
a721b1 |
LBC_H2, /* Hamgul 2 Jamo Syllable */
|
|
Packit Service |
a721b1 |
LBC_H3, /* Hangul 3 Jamo Syllable */
|
|
Packit Service |
a721b1 |
LBC_JL, /* Jamo leading consonant */
|
|
Packit Service |
a721b1 |
LBC_JV, /* Jamo vowel */
|
|
Packit Service |
a721b1 |
LBC_JT, /* Jamo trailing consonant */
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
/* These are not handled in the pair tables. */
|
|
Packit Service |
a721b1 |
LBC_SA, /* south (east) asian */
|
|
Packit Service |
a721b1 |
LBC_SP, /* space */
|
|
Packit Service |
a721b1 |
LBC_PS, /* paragraph and line separators */
|
|
Packit Service |
a721b1 |
LBC_BK, /* hard break (newline) */
|
|
Packit Service |
a721b1 |
LBC_CR, /* carriage return */
|
|
Packit Service |
a721b1 |
LBC_LF, /* line feed */
|
|
Packit Service |
a721b1 |
LBC_NL, /* next line */
|
|
Packit Service |
a721b1 |
LBC_CB, /* contingent break opportunity */
|
|
Packit Service |
a721b1 |
LBC_SG, /* surrogate */
|
|
Packit Service |
a721b1 |
LBC_AI, /* ambiguous */
|
|
Packit Service |
a721b1 |
LBC_XX, /* unknown */
|
|
Packit Service |
a721b1 |
LBC_MAX
|
|
Packit Service |
a721b1 |
};
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
enum LineBreakAction
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
LBA_DIRECT = '_',
|
|
Packit Service |
a721b1 |
LBA_INDIRECT = '%',
|
|
Packit Service |
a721b1 |
LBA_COMBINING_INDIRECT = '#',
|
|
Packit Service |
a721b1 |
LBA_COMBINING_PROHIBITED = '@',
|
|
Packit Service |
a721b1 |
LBA_PROHIBITED = '^',
|
|
Packit Service |
a721b1 |
LBA_MAX
|
|
Packit Service |
a721b1 |
};
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
/* The pair table of line break actions. */
|
|
Packit Service |
a721b1 |
static char *lba_pair_table[] =
|
|
Packit Service |
a721b1 |
/* OP GL SY PO ID BA ZW H2 JV
|
|
Packit Service |
a721b1 |
CL NS IS NU IN BB CM H3 JT
|
|
Packit Service |
a721b1 |
QU EX PR AL HY B2 WJ JL */
|
|
Packit Service |
a721b1 |
{ "^^^^^^^^^^^^^^^^^^^@^^^^^^", /* OP */
|
|
Packit Service |
a721b1 |
"_^%%^^^^_%____%%__^#^_____", /* CL */
|
|
Packit Service |
a721b1 |
"^^%%%^^^%%%%%%%%%%^#^%%%%%", /* QU */
|
|
Packit Service |
a721b1 |
"%^%%%^^^%%%%%%%%%%^#^%%%%%", /* GL */
|
|
Packit Service |
a721b1 |
"_^%%%^^^______%%__^#^_____", /* NS */
|
|
Packit Service |
a721b1 |
"_^%%%^^^______%%__^#^_____", /* EX */
|
|
Packit Service |
a721b1 |
"_^%%%^^^__%___%%__^#^_____", /* SY */
|
|
Packit Service |
a721b1 |
"_^%%%^^^__%%__%%__^#^_____", /* IS */
|
|
Packit Service |
a721b1 |
"%^%%%^^^__%%%_%%__^#^%%%%%", /* PR */
|
|
Packit Service |
a721b1 |
"_^%%%^^^______%%__^#^_____", /* PO */
|
|
Packit Service |
a721b1 |
"_^%%%^^^_%%%_%%%__^#^_____", /* NU */
|
|
Packit Service |
a721b1 |
"_^%%%^^^__%%_%%%__^#^_____", /* AL */
|
|
Packit Service |
a721b1 |
"_^%%%^^^_%___%%%__^#^_____", /* ID */
|
|
Packit Service |
a721b1 |
"_^%%%^^^_____%%%__^#^_____", /* IN */
|
|
Packit Service |
a721b1 |
"_^%%%^^^__%___%%__^#^_____", /* HY */
|
|
Packit Service |
a721b1 |
"_^%%%^^^______%%__^#^_____", /* BA */
|
|
Packit Service |
a721b1 |
"%^%%%^^^%%%%%%%%%%^#^%%%%%", /* BB */
|
|
Packit Service |
a721b1 |
"_^%%%^^^______%%_^^#^_____", /* B2 */
|
|
Packit Service |
a721b1 |
"__________________^_______", /* ZW */
|
|
Packit Service |
a721b1 |
"_^%%%^^^__%%_%%%__^#^_____", /* CM */
|
|
Packit Service |
a721b1 |
"%^%%%^^^%%%%%%%%%%^#^%%%%%", /* WJ */
|
|
Packit Service |
a721b1 |
"_^%%%^^^_%___%%%__^#^___%%", /* H2 */
|
|
Packit Service |
a721b1 |
"_^%%%^^^_%___%%%__^#^____%", /* H3 */
|
|
Packit Service |
a721b1 |
"_^%%%^^^_%___%%%__^#^%%%%_", /* JL */
|
|
Packit Service |
a721b1 |
"_^%%%^^^_%___%%%__^#^___%%", /* JV */
|
|
Packit Service |
a721b1 |
"_^%%%^^^_%___%%%__^#^____%" /* JT */
|
|
Packit Service |
a721b1 |
};
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
static MCharTable *lbc_table;
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
/* Set LBC to enum LineBreakClass of the character at POS of MT
|
|
Packit Service |
a721b1 |
(length is LEN) while converting LBC_AI and LBC_XX to LBC_AL,
|
|
Packit Service |
a721b1 |
LBC_CB to LBC_B2, LBC_CR, LBC_LF, and LBC_NL to LBC_BK. If POS is
|
|
Packit Service |
a721b1 |
out of range, set LBC to LBC_BK. */
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
#define GET_LBC(LBC, MT, LEN, POS, OPTION) \
|
|
Packit Service |
a721b1 |
do { \
|
|
Packit Service |
a721b1 |
if ((POS) < 0 || (POS) >= (LEN)) \
|
|
Packit Service |
a721b1 |
(LBC) = LBC_BK; \
|
|
Packit Service |
a721b1 |
else \
|
|
Packit Service |
a721b1 |
{ \
|
|
Packit Service |
a721b1 |
int c = mtext_ref_char ((MT), (POS)); \
|
|
Packit Service |
a721b1 |
(LBC) = (enum LineBreakClass) mchartable_lookup (lbc_table, c); \
|
|
Packit Service |
a721b1 |
if ((LBC) == LBC_NL) \
|
|
Packit Service |
a721b1 |
(LBC) = LBC_BK; \
|
|
Packit Service |
a721b1 |
else if ((LBC) == LBC_AI) \
|
|
Packit Service |
a721b1 |
(LBC) = ((OPTION) & MTEXT_LBO_AI_AS_ID) ? LBC_ID : LBC_AL; \
|
|
Packit Service |
a721b1 |
else if (! ((OPTION) & MTEXT_LBO_KOREAN_SP) \
|
|
Packit Service |
a721b1 |
&& (LBC) >= LBC_H2 && (LBC) <= LBC_JT) \
|
|
Packit Service |
a721b1 |
(LBC) = LBC_AL; \
|
|
Packit Service |
a721b1 |
else if ((LBC) == LBC_CB) \
|
|
Packit Service |
a721b1 |
(LBC) = LBC_B2; \
|
|
Packit Service |
a721b1 |
else if ((LBC) == LBC_XX) \
|
|
Packit Service |
a721b1 |
(LBC) = LBC_AL; \
|
|
Packit Service |
a721b1 |
} \
|
|
Packit Service |
a721b1 |
} while (0)
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
/*** @} */
|
|
Packit Service |
a721b1 |
#endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
/* External API */
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
/*** @addtogroup m17nMtext */
|
|
Packit Service |
a721b1 |
/*** @{ */
|
|
Packit Service |
a721b1 |
/*=*/
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
/***en
|
|
Packit Service |
a721b1 |
@brief Find a linebreak postion of an M-text.
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
The mtext_line_break () function checks if position $POS is a
|
|
Packit Service |
a721b1 |
proper linebreak position of an M-text $MT according to the
|
|
Packit Service |
a721b1 |
algorithm of The Unicode Standard 4.0 UAX#14. It so, it returns
|
|
Packit Service |
a721b1 |
$POS. Otherwise, it returns a proper linebreak position before
|
|
Packit Service |
a721b1 |
$POS.
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
If $OPTION is nonzero, it controls the algorithm by logical-or of
|
|
Packit Service |
a721b1 |
the members of #MTextLineBreakOption.
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
If $AFTER is not NULL, a proper linebreak position after $POS is
|
|
Packit Service |
a721b1 |
stored there. */
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
int
|
|
Packit Service |
a721b1 |
mtext_line_break (MText *mt, int pos, int option, int *after)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
int break_before, break_after;
|
|
Packit Service |
a721b1 |
int len = mtext_len (mt);
|
|
Packit Service |
a721b1 |
enum LineBreakClass lbc;
|
|
Packit Service |
a721b1 |
enum LineBreakClass Blbc, Albc; /* B(efore) and A(fter) lbcs. */
|
|
Packit Service |
a721b1 |
int Bpos, Apos; /* B(efore) and A(fter) positions. */
|
|
Packit Service |
a721b1 |
enum LineBreakAction action;
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
if (pos >= len)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
/* The end of text is an explicit break position. */
|
|
Packit Service |
a721b1 |
if (after)
|
|
Packit Service |
a721b1 |
*after = pos;
|
|
Packit Service |
a721b1 |
return pos;
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
if (! lbc_table)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
MSymbol key = mchar_define_property ("linebreak", Minteger);
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
lbc_table = mchar_get_prop_table (key, NULL);
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
GET_LBC (lbc, mt, len, pos, option);
|
|
Packit Service |
a721b1 |
Apos = pos;
|
|
Packit Service |
a721b1 |
Albc = lbc;
|
|
Packit Service |
a721b1 |
if (Albc == LBC_SP)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
if (option & MTEXT_LBO_SP_CM)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
GET_LBC (Albc, mt, len, Apos + 1, option);
|
|
Packit Service |
a721b1 |
Albc = (Albc == LBC_CM) ? LBC_ID : LBC_SP;
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
while (Albc == LBC_SP)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
Apos--;
|
|
Packit Service |
a721b1 |
GET_LBC (Albc, mt, len, Apos, option);
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
if ((option & MTEXT_LBO_SP_CM) && (Albc == LBC_CM))
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
Apos--;
|
|
Packit Service |
a721b1 |
GET_LBC (Albc, mt, len, Apos, option);
|
|
Packit Service |
a721b1 |
if (Albc == LBC_SP)
|
|
Packit Service |
a721b1 |
Albc = LBC_ID;
|
|
Packit Service |
a721b1 |
else
|
|
Packit Service |
a721b1 |
Apos++, Albc = LBC_CM;
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
if (Albc == LBC_CR)
|
|
Packit Service |
a721b1 |
Albc = LBC_BK;
|
|
Packit Service |
a721b1 |
else if (Albc == LBC_LF)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
GET_LBC (Albc, mt, len, Apos - 1, option);
|
|
Packit Service |
a721b1 |
if (Albc == LBC_CR)
|
|
Packit Service |
a721b1 |
Apos--;
|
|
Packit Service |
a721b1 |
Albc = LBC_BK;
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
else if (Albc == LBC_SA)
|
|
Packit Service |
a721b1 |
Albc = mtext__word_segment (mt, Apos, &Apos, NULL) > 0 ? LBC_BB : LBC_AL;
|
|
Packit Service |
a721b1 |
Bpos = Apos;
|
|
Packit Service |
a721b1 |
/* After exiting from the following loop, if Apos is positive, it is
|
|
Packit Service |
a721b1 |
the previous (including POS) break position. */
|
|
Packit Service |
a721b1 |
while (Apos > 0)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
int indirect;
|
|
Packit Service |
a721b1 |
int next = -1;
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
/* Now Bpos == Apos. */
|
|
Packit Service |
a721b1 |
do {
|
|
Packit Service |
a721b1 |
Bpos--;
|
|
Packit Service |
a721b1 |
GET_LBC (Blbc, mt, len, Bpos, option);
|
|
Packit Service |
a721b1 |
} while (Blbc == LBC_SP);
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
if (Blbc == LBC_BK || Blbc == LBC_LF || Blbc == LBC_CR)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
/* Explicit break. */
|
|
Packit Service |
a721b1 |
break;
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
indirect = Bpos + 1 < Apos;
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
if (Blbc == LBC_CM)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
do {
|
|
Packit Service |
a721b1 |
Bpos--;
|
|
Packit Service |
a721b1 |
GET_LBC (Blbc, mt, len, Bpos, option);
|
|
Packit Service |
a721b1 |
} while (Blbc == LBC_CM);
|
|
Packit Service |
a721b1 |
if ((option & MTEXT_LBO_SP_CM) && (Blbc == LBC_SP))
|
|
Packit Service |
a721b1 |
Blbc = LBC_ID;
|
|
Packit Service |
a721b1 |
else if (Blbc == LBC_SP || Blbc == LBC_ZW
|
|
Packit Service |
a721b1 |
|| Blbc == LBC_BK || Blbc == LBC_LF || Blbc == LBC_CR)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
Blbc = LBC_AL;
|
|
Packit Service |
a721b1 |
Bpos++;
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
if (Blbc == LBC_SA)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
mtext__word_segment (mt, Bpos, &next, NULL);
|
|
Packit Service |
a721b1 |
Blbc = LBC_AL;
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
if (Albc != LBC_BK)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
action = lba_pair_table[Blbc][Albc];
|
|
Packit Service |
a721b1 |
if (action == LBA_DIRECT)
|
|
Packit Service |
a721b1 |
break;
|
|
Packit Service |
a721b1 |
else if (action == LBA_INDIRECT)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
if (indirect)
|
|
Packit Service |
a721b1 |
break;
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
else if (action == LBA_COMBINING_INDIRECT)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
if (indirect)
|
|
Packit Service |
a721b1 |
break;
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
if (next >= 0)
|
|
Packit Service |
a721b1 |
Apos = next, Albc = LBC_BB;
|
|
Packit Service |
a721b1 |
else
|
|
Packit Service |
a721b1 |
Apos = Bpos, Albc = Blbc;
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
break_before = Apos;
|
|
Packit Service |
a721b1 |
if (break_before > 0)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
if (! after)
|
|
Packit Service |
a721b1 |
return break_before;
|
|
Packit Service |
a721b1 |
if (break_before == pos)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
if (after)
|
|
Packit Service |
a721b1 |
*after = break_before;
|
|
Packit Service |
a721b1 |
return break_before;
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
/* Now find a break position after POS. */
|
|
Packit Service |
a721b1 |
break_after = 0;
|
|
Packit Service |
a721b1 |
Bpos = pos;
|
|
Packit Service |
a721b1 |
Blbc = lbc;
|
|
Packit Service |
a721b1 |
if (Blbc == LBC_CM)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
do {
|
|
Packit Service |
a721b1 |
Bpos--;
|
|
Packit Service |
a721b1 |
GET_LBC (Blbc, mt, len, Bpos, option);
|
|
Packit Service |
a721b1 |
} while (Blbc == LBC_CM);
|
|
Packit Service |
a721b1 |
if (Blbc == LBC_SP || Blbc == LBC_ZW
|
|
Packit Service |
a721b1 |
|| Blbc == LBC_BK || Blbc == LBC_LF || Blbc == LBC_CR)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
if ((Blbc == LBC_SP) && (option & MTEXT_LBO_SP_CM))
|
|
Packit Service |
a721b1 |
Blbc = LBC_ID;
|
|
Packit Service |
a721b1 |
else
|
|
Packit Service |
a721b1 |
Blbc = LBC_AL;
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
Bpos = pos;
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
if (Blbc == LBC_SA)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
mtext__word_segment (mt, Bpos, NULL, &Bpos);
|
|
Packit Service |
a721b1 |
Blbc = LBC_AL;
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
else if (Blbc == LBC_SP)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
if (option & MTEXT_LBO_SP_CM)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
GET_LBC (Blbc, mt, len, Bpos + 1, option);
|
|
Packit Service |
a721b1 |
if (Blbc == LBC_CM)
|
|
Packit Service |
a721b1 |
Blbc = LBC_ID, Bpos++;
|
|
Packit Service |
a721b1 |
else
|
|
Packit Service |
a721b1 |
Blbc = LBC_SP;
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
while (Blbc == LBC_SP)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
Bpos--;
|
|
Packit Service |
a721b1 |
GET_LBC (Blbc, mt, len, Bpos, option);
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
if (Bpos < 0)
|
|
Packit Service |
a721b1 |
Bpos = pos;
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
Apos = Bpos;
|
|
Packit Service |
a721b1 |
/* After exiting from the following loop, if Apos is positive, it is
|
|
Packit Service |
a721b1 |
the next break position. */
|
|
Packit Service |
a721b1 |
while (1)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
int indirect;
|
|
Packit Service |
a721b1 |
int next = -1;
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
/* Now Bpos == Apos. */
|
|
Packit Service |
a721b1 |
if (Blbc == LBC_LF || Blbc == LBC_BK || Blbc == LBC_CR)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
Apos++;
|
|
Packit Service |
a721b1 |
if (Blbc == LBC_CR)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
GET_LBC (Blbc, mt, len, Bpos + 1, option);
|
|
Packit Service |
a721b1 |
if (Blbc == LBC_LF)
|
|
Packit Service |
a721b1 |
Apos++;
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
break;
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
do {
|
|
Packit Service |
a721b1 |
Apos++;
|
|
Packit Service |
a721b1 |
GET_LBC (Albc, mt, len, Apos, option);
|
|
Packit Service |
a721b1 |
} while (Albc == LBC_SP);
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
if (Blbc == LBC_SP)
|
|
Packit Service |
a721b1 |
break;
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
if (Apos == len)
|
|
Packit Service |
a721b1 |
/* Explicit break at the end of text. */
|
|
Packit Service |
a721b1 |
break;
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
indirect = Bpos + 1 < Apos;
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
if (Albc == LBC_SA)
|
|
Packit Service |
a721b1 |
Albc = mtext__word_segment (mt, Apos, NULL, &next) ? LBC_BB : LBC_AL;
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
action = lba_pair_table[Blbc][Albc];
|
|
Packit Service |
a721b1 |
if (action == LBA_DIRECT)
|
|
Packit Service |
a721b1 |
/* Direct break at Apos. */
|
|
Packit Service |
a721b1 |
break;
|
|
Packit Service |
a721b1 |
else if (action == LBA_INDIRECT)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
if (indirect)
|
|
Packit Service |
a721b1 |
break;
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
else if (action == LBA_COMBINING_INDIRECT)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
if (indirect)
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
if (option & MTEXT_LBO_SP_CM)
|
|
Packit Service |
a721b1 |
Apos--;
|
|
Packit Service |
a721b1 |
break;
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
if (next >= 0)
|
|
Packit Service |
a721b1 |
Bpos = next, Blbc = LBC_AL;
|
|
Packit Service |
a721b1 |
else
|
|
Packit Service |
a721b1 |
{
|
|
Packit Service |
a721b1 |
Bpos = Apos;
|
|
Packit Service |
a721b1 |
if (Albc != LBC_CM)
|
|
Packit Service |
a721b1 |
Blbc = Albc;
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
break_after = Apos;
|
|
Packit Service |
a721b1 |
if (after)
|
|
Packit Service |
a721b1 |
*after = break_after;
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
return (break_before > 0 ? break_before : break_after);
|
|
Packit Service |
a721b1 |
}
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
/*** @} */
|
|
Packit Service |
a721b1 |
|
|
Packit Service |
a721b1 |
/*
|
|
Packit Service |
a721b1 |
Local Variables:
|
|
Packit Service |
a721b1 |
coding: euc-japan
|
|
Packit Service |
a721b1 |
End:
|
|
Packit Service |
a721b1 |
*/
|