bwstring.h revision 235267
142660Smarkm/*	$FreeBSD: head/usr.bin/sort/bwstring.h 235267 2012-05-11 12:37:16Z gabor $	*/
2146515Sru
321495Sjmacd/*-
4146515Sru * Copyright (C) 2009 Gabor Kovesdan <gabor@FreeBSD.org>
5146515Sru * Copyright (C) 2012 Oleg Moskalenko <oleg.moskalenko@citrix.com>
621495Sjmacd * All rights reserved.
721495Sjmacd *
821495Sjmacd * Redistribution and use in source and binary forms, with or without
921495Sjmacd * modification, are permitted provided that the following conditions
1021495Sjmacd * are met:
1121495Sjmacd * 1. Redistributions of source code must retain the above copyright
1221495Sjmacd *    notice, this list of conditions and the following disclaimer.
1321495Sjmacd * 2. Redistributions in binary form must reproduce the above copyright
1421495Sjmacd *    notice, this list of conditions and the following disclaimer in the
1521495Sjmacd *    documentation and/or other materials provided with the distribution.
1621495Sjmacd *
1721495Sjmacd * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1821495Sjmacd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1921495Sjmacd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2021495Sjmacd * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2121495Sjmacd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2221495Sjmacd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2321495Sjmacd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2442660Smarkm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2521495Sjmacd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2621495Sjmacd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2721495Sjmacd * SUCH DAMAGE.
2821495Sjmacd */
2921495Sjmacd
3021495Sjmacd#if !defined(__BWSTRING_H__)
3156160Sru#define __BWSTRING_H__
3221495Sjmacd
3321495Sjmacd#include <stdbool.h>
3421495Sjmacd#include <stdio.h>
3521495Sjmacd#include <errno.h>
3621495Sjmacd#include <sysexits.h>
3721495Sjmacd#include <wchar.h>
3821495Sjmacd
3942660Smarkm#include "mem.h"
4042660Smarkm
4142660Smarkmextern bool byte_sort;
4242660Smarkm
4356160Sru/* wchar_t is of 4 bytes: */
4456160Sru#define SIZEOF_WCHAR_STRING(LEN) ((LEN)*sizeof(wchar_t))
4556160Sru
4656160Sru/*
4756160Sru * Binary "wide" string
4842660Smarkm */
4956160Srustruct bwstring
5042660Smarkm{
5142660Smarkm	size_t				len;
5221495Sjmacd	union
5321495Sjmacd	{
5421495Sjmacd		wchar_t		wstr[0];
5521495Sjmacd		unsigned char	cstr[0];
5621495Sjmacd	}				data;
5721495Sjmacd};
5821495Sjmacd
5921495Sjmacdstruct reader_buffer
6021495Sjmacd{
6121495Sjmacd	wchar_t			*fgetwln_z_buffer;
6221495Sjmacd	size_t			 fgetwln_z_buffer_size;
6321495Sjmacd};
6421495Sjmacd
6521495Sjmacdtypedef void *bwstring_iterator;
6621495Sjmacd
6721495Sjmacd#define BWSLEN(s) ((s)->len)
6821495Sjmacd
6921495Sjmacdstruct bwstring *bwsalloc(size_t sz);
7021495Sjmacd
7121495Sjmacdsize_t bwsrawlen(const struct bwstring *bws);
7221495Sjmacdconst void* bwsrawdata(const struct bwstring *bws);
7321495Sjmacdvoid bws_setlen(struct bwstring *bws, size_t newlen);
7421495Sjmacdsize_t bws_memsize(const struct bwstring *bws);
7521495Sjmacddouble bwstod(struct bwstring *s0, bool *empty);
7621495Sjmacdint bws_month_score(const struct bwstring *s0);
7756160Sru
7856160Srustruct bwstring *ignore_leading_blanks(struct bwstring *str);
7956160Srustruct bwstring *ignore_nonprinting(struct bwstring *str);
80146515Srustruct bwstring *dictionary_order(struct bwstring *str);
81146515Srustruct bwstring *ignore_case(struct bwstring *str);
8293139Sru
83146515Sruvoid bwsprintf(FILE*, struct bwstring*, const char *prefix, const char *suffix);
84146515Sruvoid bws_disorder_warnx(struct bwstring *s, const char *fn, size_t pos);
85146515Sru
8656160Srustruct bwstring *bwsdup(const struct bwstring *s);
8756160Srustruct bwstring *bwssbdup(const wchar_t *str, size_t size);
8856160Srustruct bwstring *bwscsbdup(const unsigned char *str, size_t size);
8956160Sruvoid bwsfree(const struct bwstring *s);
9056160Srusize_t bwscpy(struct bwstring *dst, const struct bwstring *src);
9156160Srustruct bwstring *bwsncpy(struct bwstring *dst, const struct bwstring *src, size_t size);
9256160Srustruct bwstring *bwsnocpy(struct bwstring *dst, const struct bwstring *src, size_t offset, size_t size);
9356160Sruint bwscmp(const struct bwstring *bws1, const struct bwstring *bws2, size_t offset);
9456160Sruint bwsncmp(const struct bwstring *bws1, const struct bwstring *bws2, size_t offset, size_t len);
9521495Sjmacdint bwscoll(const struct bwstring *bws1, const struct bwstring *bws2, size_t offset);
9621495Sjmacdint bwsfwrite(struct bwstring *bws, FILE *f, bool zero_ended);
9721495Sjmacdstruct bwstring *bwsfgetln(FILE *file, size_t *len, bool zero_ended, struct reader_buffer *rb);
9821495Sjmacd
9921495Sjmacdstatic inline bwstring_iterator
10021495Sjmacdbws_begin(struct bwstring *bws)
10142660Smarkm{
10221495Sjmacd
10321495Sjmacd	return (bwstring_iterator) (&(bws->data));
10421495Sjmacd}
105100513Sru
106100513Srustatic inline bwstring_iterator
107100513Srubws_end(struct bwstring *bws)
108100513Sru{
109146515Sru
11021495Sjmacd	return ((MB_CUR_MAX == 1) ?
11121495Sjmacd	    (bwstring_iterator) (bws->data.cstr + bws->len) :
11293139Sru	    (bwstring_iterator) (bws->data.wstr + bws->len));
113146515Sru}
114100513Sru
11556160Srustatic inline bwstring_iterator
116100513Srubws_iterator_inc(bwstring_iterator iter, size_t pos)
11756160Sru{
118100513Sru
11956160Sru	if (MB_CUR_MAX == 1)
120146515Sru		return ((unsigned char *) iter) + pos;
12156160Sru	else
12256160Sru		return ((wchar_t*) iter) + pos;
12356160Sru}
12421495Sjmacd
12521495Sjmacdstatic inline wchar_t
12621495Sjmacdbws_get_iter_value(bwstring_iterator iter)
12721495Sjmacd{
12856160Sru
129146515Sru	if (MB_CUR_MAX == 1)
13056160Sru		return *((unsigned char *) iter);
131146515Sru	else
13256160Sru		return *((wchar_t*) iter);
13321495Sjmacd}
13421495Sjmacd
13521495Sjmacdint
13621495Sjmacdbws_iterator_cmp(bwstring_iterator iter1, bwstring_iterator iter2, size_t len);
13721495Sjmacd
138146515Sru#define BWS_GET(bws, pos) ((MB_CUR_MAX == 1) ? ((bws)->data.cstr[(pos)]) : (bws)->data.wstr[(pos)])
139146515Sru
14021495Sjmacdvoid initialise_months(void);
14121495Sjmacd
14221495Sjmacd#endif /* __BWSTRING_H__ */
14342660Smarkm