Blame src/mtext-lbrk.c

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
*/