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