1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include "precompile.h"
32 #include <rtl/character.hxx>
34 int HBox::boxCount
= 0;
51 static const int wsize
[32] =
53 1, 4, 4, 4, 4, 4, 4, 42, /* dateform */
54 48, 4, 4, 4, 4, 1, 4, 4, /* hidden */
55 4, 4, 4, 4, 4, 4, 12, 5, /* chcompose */
56 3, 3, 123, 4, 32, 4, 2, 2
67 SkipData::SkipData(hchar hch
)
78 FieldCode::FieldCode()
84 FieldCode::~FieldCode()
101 DateFormat::DateFormat()
117 const hchar kor_week
[] =
119 0xB7A9, 0xB6A9, 0xD1C1, 0xAE81, 0xA1A2, 0x8B71, 0xC9A1
121 const hchar china_week
[] =
123 0x4CC8, 0x4BE4, 0x525A, 0x48D8, 0x45AB, 0x4270, 0x50B4
125 const char eng_week
[] = { "SunMonTueWedThuFriSat" };
126 const char eng_mon
[] = { "JanFebMarAprMayJunJulAugSepOctNovDec" };
127 const char * const en_mon
[] =
129 "January", "February", "March", "April", "May", "June", "July",
130 "August", "September", "October", "November", "December"
132 const char * const en_week
[] =
134 "Sunday", "Monday", "Tuesday", "Wednesday",
135 "Thursday", "Friday", "Saturday"
138 hchar_string
DateCode::GetString()
145 bool is_pm
, add_zero
;
148 format
[DATE_SIZE
- 1] = 0;
149 fmt
= format
[0] ? format
: defaultform
;
151 for (; *fmt
&& (static_cast<int>(ret
.size()) < DATE_SIZE
); fmt
++)
153 form
= add_zero
? "%02d" : "%d";
156 is_pm
= (date
[HOUR
] >= 12);
170 num
= date
[YEAR
] % 100;
177 static_assert((std::size(eng_mon
) - 1) / 3 == 12);
178 size_t nIndex
= o3tl::make_unsigned(date
[MONTH
] - 1) % 12;
179 memcpy(cbuf
, eng_mon
+ nIndex
* 3, 3);
186 size_t nIndex
= o3tl::make_unsigned(date
[MONTH
] - 1) % std::size(en_mon
);
187 strncat(cbuf
, en_mon
[nIndex
], sizeof(cbuf
) - strlen(cbuf
) - 1);
190 case '3': /* 'D' is day of korean */
195 switch (date
[DAY
] % 10)
212 num
= date
[HOUR
] - ((date
[HOUR
] > 12) ? 12 : 0);
223 size_t nIndex
= o3tl::make_unsigned(date
[WEEK
]) % std::size(kor_week
);
224 ret
.push_back(kor_week
[nIndex
]);
229 static_assert((std::size(eng_week
) - 1) / 3 == 7);
230 size_t nIndex
= o3tl::make_unsigned(date
[WEEK
]) % 7;
231 memcpy(cbuf
, eng_week
+ nIndex
* 3, 3);
238 size_t nIndex
= o3tl::make_unsigned(date
[WEEK
]) % std::size(en_week
);
239 strncat(cbuf
, en_week
[nIndex
], sizeof(cbuf
) - strlen(cbuf
) - 1);
243 ret
.push_back(0xB5A1);
244 ret
.push_back(is_pm
? 0xD281 : 0xB8E5);
247 strncat(cbuf
, is_pm
? "p.m." : "a.m.", sizeof(cbuf
) - strlen(cbuf
) - 1);
250 strncat(cbuf
, is_pm
? "P.M." : "A.M.", sizeof(cbuf
) - strlen(cbuf
) - 1);
252 case '8': // 2.5 feature
256 mkcurfilename(cbuf
, *fmt
);
257 for (i
= 0; cbuf
[i
] != 0 && slen
> 1; i
++)
258 { //for hangle filename
259 if (cbuf
[i
] & 0x80 && cbuf
[i
+ 1] != 0)
261 *d
++ = (cbuf
[i
] << 8) | cbuf
[i
+ 1];
271 case '~': // 3.0b feature
277 size_t nIndex
= o3tl::make_unsigned(date
[WEEK
]) % std::size(china_week
);
278 ret
.push_back(china_week
[nIndex
]);
283 if (*fmt
== '\\' && *++fmt
== 0)
288 sprintf(cbuf
, form
, num
);
289 for (i
= 0; 0 != cbuf
[i
]; i
++)
291 ret
.push_back(*(cbuf
+ i
));
308 FBox::FBox(hchar hch
)
338 // tbox(10) TABLE BOX MATH BUTTON HYPERTEXT
356 reserved
[0] = reserved
[1] = 0;
369 , follow_block_size(0)
386 if (pictype
== PICTYPE_DRAW
)
387 delete picinfo
.picdraw
.hdo
;
399 HeaderFooter::~HeaderFooter()
405 Footnote::~Footnote()
412 // show page number (20)
413 // Start/Hide odd-numbered side (21)
416 hchar_string
MailMerge::GetString()
418 return hchar_string();
422 // character composition(23)
428 #define OL_HANGL_JASO 0
429 #define OL_HANGL_KANATA 1
431 static hchar
olHanglJaso(int num
, int type
)
433 static const unsigned char han_init
[] =
434 { 0x88, 0x90, 0x94, 0x9c, 0xa0, 0xa4, 0xac, 0xb4, 0xb8, 0xc0, 0xc4, 0xc8, 0xcc, 0xd0 };
435 static const unsigned char jung
[] = { 3, 5, 7, 11, 13, 19, 20, 26, 27, 29, 30 };
436 static const unsigned char jung2
[] = { 3, 7, 13, 20, 27, 29, 30 };
440 if (type
== OL_HANGL_JASO
)
442 num
= num
% (14 + SAL_N_ELEMENTS(jung
));
445 hh
= (han_init
[num
] << 8) | 'A';
447 hh
= (jung
[num
- 14] << 5) | 0x8401;
452 hh
= (han_init
[num
] << 8) | 'a';
455 int j
= (num
/ 14) % SAL_N_ELEMENTS(jung2
);
458 hh
= (han_init
[num
] << 8) | (jung2
[j
] << 5) | 1;
465 static const hchar
*GetOutlineStyleChars(int style
)
467 static const hchar out_bul_style_entry
[5][8] = // extern
470 0x2f18, 0x2f12, 0x2f08, 0x2f02, 0x2f06, 0x2f00, 0x2043, 0x0000
473 0x2f18, 0x2f12, 0x2f06, 0x2f00, 0x2f36, 0x2f30, 0x2043, 0x0000
476 0x2f26, 0x2f20, 0x2f06, 0x2f00, 0x2f16, 0x2f10, 0x2043, 0x0000
479 0x2f18, 0x2f16, 0x2f12, 0x2f10, 0x2f06, 0x2f00, 0x2043, 0x0000
482 0xAC61, 0xB677, 0xB861, 0xB8F7, 0xB781, 0x0000
485 if (style
>= OLSTY_BULLET1
&& style
<= OLSTY_BULLET5
)
486 return out_bul_style_entry
[style
- OLSTY_BULLET1
];
491 static void getOutlineNumStr(int style
, int level
, int num
, hchar
* hstr
)
495 U_ROM
= 0x01, L_ROM
= 0x02, U_ENG
= 0x04, L_ENG
= 0x08,
496 HAN
= 0x10, NUM
= 0x20, L_BR
= 0x40, R_BR
= 0x80
498 static const unsigned char type_tbl
[][MAX_OUTLINE_LEVEL
] =
501 U_ROM
, HAN
, NUM
, HAN
| R_BR
, L_BR
| NUM
| R_BR
,
502 L_BR
| HAN
| R_BR
, L_ROM
| R_BR
505 U_ROM
, U_ENG
, NUM
, L_ENG
| R_BR
, L_BR
| NUM
| R_BR
,
506 L_BR
| L_ENG
| R_BR
, L_ROM
| R_BR
509 NUM
, HAN
, L_BR
| NUM
| R_BR
, L_BR
| HAN
| R_BR
, NUM
|
510 R_BR
, HAN
| R_BR
, L_ENG
513 char fmt
= type_tbl
[style
- OLSTY_NUMSIG1
][level
];
522 sprintf(buf
, "%d", num
);
526 else if (fmt
& (U_ROM
| L_ROM
))
534 *ptr
= sal::static_int_cast
<char>(
535 rtl::toAsciiUpperCase(static_cast<unsigned char>(*ptr
)));
544 num
= (num
- 1) % 26;
546 *hstr
++ = sal::static_int_cast
<hchar
>('A' + num
);
547 else if (fmt
& L_ENG
)
548 *hstr
++ = sal::static_int_cast
<hchar
>('a' + num
);
550 *hstr
++ = olHanglJaso(num
, OL_HANGL_KANATA
);
552 *hstr
++ = (fmt
& R_BR
) ? ')' : '.';
558 { OUTLINE_ON
, OUTLINE_NUM
};
560 /* level starts from zero. ex) '1.1.1.' is the level 2.
561 number has the value. ex) '1.2.1' has '1,2,1'
562 style has the value which starts from 1 according to the definition in hbox.h
564 hchar_string
Outline::GetUnicode() const
570 if (kind
== OUTLINE_NUM
)
578 char cur_num_str
[10], buf
[80];
582 for (i
= 0; i
<= level
; i
++)
584 levelnum
= ((number
[i
] < 1) ? 1 : number
[i
]);
585 if (shape
== OLSTY_NUMS2
&& i
&& i
== level
)
586 sprintf(cur_num_str
, "%d%c", levelnum
, 0);
588 sprintf(cur_num_str
, "%d%c", levelnum
, '.');
589 strcat(buf
, cur_num_str
);
591 str2hstr(buf
, buffer
);
592 return hstr2ucsstr(buffer
);
598 getOutlineNumStr(shape
, level
, number
[level
], buffer
);
599 return hstr2ucsstr(buffer
);
607 p
= GetOutlineStyleChars(shape
);
608 buffer
[0] = p
[level
];
610 return hstr2ucsstr(buffer
);
619 buffer
[l
++] = deco
[i
][0];
621 /* level starts from zero. ex) '1.1.1.' is the level 2.
622 number has the value. ex) '1.2.1' has '1,2,1'
623 style has the value which starts from 1 according to the definition in hbox.h
625 switch( user_shape
[i
] )
628 buffer
[l
++] = '1' + number
[i
] - 1;
630 case 1: /* Uppercase Roman */
631 case 2: /* Lowercase Roman */
632 num2roman(number
[i
], dest
);
633 if( user_shape
[i
] == 1 ){
637 *ptr
= sal::static_int_cast
<char>(rtl::toAsciiUpperCase(static_cast<unsigned char>(*ptr
)));
641 str2hstr(dest
, buffer
+ l
);
645 buffer
[l
++] = 'A' + number
[i
] -1;
648 buffer
[l
++] = 'a' + number
[i
] -1;
651 buffer
[l
++] = olHanglJaso(number
[i
] -1, OL_HANGL_KANATA
);
654 buffer
[l
++] = olHanglJaso(number
[i
] -1, OL_HANGL_JASO
);
656 case 7: /* Chinese numbers: the number represented by the general */
657 buffer
[l
++] = '1' + number
[i
] -1;
659 case 8: /* Circled numbers */
660 buffer
[l
++] = 0x2e00 + number
[i
];
662 case 9: /* Circled lowercase alphabet */
663 buffer
[l
++] = 0x2c20 + number
[i
];
665 case 10: /* Circled Korean Alphabet */
666 buffer
[l
++] = 0x2c50 + number
[i
] -1;
668 case 11: /* Circled Korean Characters */
669 buffer
[l
++] = 0x2c40 + number
[i
] -1;
671 case 12: /* Sequenced numbers. */
673 char cur_num_str
[10],buf
[80];
676 for (j
= 0; j
<= level
; j
++)
678 levelnum
= ((number
[j
] < 1) ? 1 : number
[j
]);
679 if ((j
&& j
== level
) || (j
== level
&& deco
[i
][1]))
680 sprintf(cur_num_str
, "%d%c", levelnum
, 0);
682 sprintf(cur_num_str
, "%d%c", levelnum
, '.');
683 strcat(buf
, cur_num_str
);
685 str2hstr(buf
, buffer
+ l
);
690 buffer
[l
++] = user_shape
[i
];
694 buffer
[l
++] = deco
[i
][1];
697 return hstr2ucsstr(buffer
);
701 return hstr2ucsstr(buffer
);
705 /* Bundle of spaces (30) */
706 /* Fixed-width spaces (31) */
708 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */