plover/vector.c
author J. Ali Harlow <ali@juiblex.co.uk>
Tue Jun 28 19:46:00 2016 +0100 (2016-06-28)
changeset 53 2740f1329ddc
permissions -rw-r--r--
Fix make distcheck build
ali@24
     1
/*
ali@24
     2
 * Copyright (C) 2009, 2014  J. Ali Harlow <ali@juiblex.co.uk>
ali@24
     3
 *
ali@24
     4
 * This program is free software; you can redistribute it and/or modify
ali@24
     5
 * it under the terms of the GNU General Public License as published by
ali@24
     6
 * the Free Software Foundation; either version 2 of the License, or
ali@24
     7
 * (at your option) any later version.
ali@24
     8
 *
ali@24
     9
 * This program is distributed in the hope that it will be useful,
ali@24
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ali@24
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
ali@24
    12
 * GNU General Public License for more details.
ali@24
    13
 *
ali@24
    14
 * You should have received a copy of the GNU General Public License along
ali@24
    15
 * with this program; if not, write to the Free Software Foundation, Inc.,
ali@24
    16
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
ali@24
    17
 */
ali@24
    18
ali@24
    19
#include <stdlib.h>
ali@24
    20
#include <string.h>
ali@24
    21
#include "config.h"
ali@24
    22
#include "plover.h"
ali@24
    23
ali@24
    24
struct plover_vector *plover_vector_new(void)
ali@24
    25
{
ali@24
    26
    struct plover_vector *vector;
ali@24
    27
    vector=malloc(sizeof(*vector));
ali@24
    28
    vector->len=0;
ali@24
    29
    vector->alloc=16;
ali@24
    30
    vector->strings=calloc(vector->alloc,sizeof(char *));
ali@24
    31
    return vector;
ali@24
    32
}
ali@24
    33
ali@24
    34
struct plover_vector *plover_vector_dup(struct plover_vector *old)
ali@24
    35
{
ali@24
    36
    int i;
ali@24
    37
    struct plover_vector *vector;
ali@24
    38
    vector=malloc(sizeof(*vector));
ali@24
    39
    vector->len=old->len;
ali@24
    40
    vector->alloc=old->alloc;
ali@24
    41
    vector->strings=calloc(vector->alloc,sizeof(char *));
ali@24
    42
    for(i=0;i<old->len;i++)
ali@24
    43
	vector->strings[i]=strdup(old->strings[i]);
ali@24
    44
    vector->strings[i]=NULL;
ali@24
    45
    return vector;
ali@24
    46
}
ali@24
    47
ali@24
    48
void plover_vector_append(struct plover_vector *vector,const char *str)
ali@24
    49
{
ali@24
    50
    if (++(vector->len)>=vector->alloc)
ali@24
    51
    {
ali@24
    52
	vector->alloc*=2;
ali@24
    53
	vector->strings=realloc(vector->strings,vector->alloc*sizeof(char *));
ali@24
    54
    }
ali@24
    55
    vector->strings[vector->len-1]=strdup(str);
ali@24
    56
    vector->strings[vector->len]=NULL;
ali@24
    57
}
ali@24
    58
ali@24
    59
int plover_vector_contains(struct plover_vector *vector,const char *str)
ali@24
    60
{
ali@24
    61
    int i;
ali@24
    62
    for(i=0;i<vector->len;i++)
ali@24
    63
	if (!strcmp(vector->strings[i],str))
ali@24
    64
	    return 1;
ali@24
    65
    return 0;
ali@24
    66
}
ali@24
    67
ali@24
    68
int plover_vector_remove(struct plover_vector *vector,const char *str)
ali@24
    69
{
ali@24
    70
    int i;
ali@24
    71
    for(i=0;i<vector->len;i++)
ali@24
    72
	if (!strcmp(vector->strings[i],str))
ali@24
    73
	{
ali@24
    74
	    free(vector->strings[i]);
ali@24
    75
	    vector->len--;
ali@24
    76
	    vector->strings[i]=vector->strings[vector->len];
ali@24
    77
	    vector->strings[vector->len]=NULL;
ali@24
    78
	    return 1;
ali@24
    79
	}
ali@24
    80
    return 0;
ali@24
    81
}
ali@24
    82
ali@24
    83
static int string_compar(const void *p1,const void *p2)
ali@24
    84
{
ali@24
    85
    return strcmp(*(char * const *)p1,*(char * const *)p2);
ali@24
    86
}
ali@24
    87
ali@24
    88
void plover_vector_sort(struct plover_vector *vector)
ali@24
    89
{
ali@24
    90
    qsort(vector->strings,vector->len,sizeof(char *),string_compar);
ali@24
    91
}
ali@24
    92
ali@24
    93
char *plover_vector_format_for_display(struct plover_vector *vector)
ali@24
    94
{
ali@24
    95
    int i,len;
ali@24
    96
    char *s,*p;
ali@24
    97
    if (!vector->len)
ali@24
    98
	return strdup("none");
ali@24
    99
    else if (vector->len==1)
ali@24
   100
	return strdup(vector->strings[0]);
ali@24
   101
    else
ali@24
   102
    {
ali@24
   103
	len=(vector->len-1)*2+5+1;
ali@24
   104
	for(i=0;i<vector->len;i++)
ali@24
   105
	    len+=strlen(vector->strings[i]);
ali@24
   106
	s=malloc(len);
ali@24
   107
	strcpy(s,vector->strings[0]);
ali@24
   108
	p=s+strlen(s);
ali@24
   109
	for(i=1;i<vector->len-1;i++)
ali@24
   110
	{
ali@24
   111
	    *p++=',';
ali@24
   112
	    *p++=' ';
ali@24
   113
	    strcpy(p,vector->strings[i]);
ali@24
   114
	    p+=strlen(p);
ali@24
   115
	}
ali@24
   116
	strcpy(p," and ");
ali@24
   117
	p+=5;
ali@24
   118
	strcpy(p,vector->strings[i]);
ali@24
   119
	return s;
ali@24
   120
    }
ali@24
   121
}
ali@24
   122
ali@24
   123
void plover_vector_free(struct plover_vector *vector)
ali@24
   124
{
ali@24
   125
    int i;
ali@24
   126
    for(i=0;i<vector->len;i++)
ali@24
   127
	free(vector->strings[i]);
ali@24
   128
    free(vector->strings);
ali@24
   129
    free(vector);
ali@24
   130
}