Show string.c syntax highlighted
/*
*
* Copyright (c) 2003 The Regents of the University of California. All
* rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Neither the name of the University nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
/*
* libmisc: string utilities
*/
char misc_string_cvsid[] = "$Id: string.c,v 1.9 2004/03/02 22:05:55 girod Exp $";
#include <misc.h>
char *misc_string_realloc_null_term(const char *buffer, int length)
{
char *retval = (char*)malloc(length+1);
if (retval) {
memmove(retval, buffer, length);
retval[length] = 0;
}
return retval;
}
/*
* strips the trailing CR and LF chars from a string, in place.
* modifies the argument.
*/
void misc_strip_trailing_crlfs(char *line)
{
char *p = line + strlen(line) - 1;
while (p >= line && (*p == '\n' || *p == '\r')) {
*p = '\0';
p--;
}
}
/*
* get_line reads the next non-blank line off of the input stream and
* places it into the buffer pointed to by buf. Lines which begin
* with '#' are considered to be comments and skipped. Will truncate
* any input of length greater than MAX_LINE-1. (MAX)LINE is the size
* of the buffer needed, including the terminating null). The newline
* character is removed from the input.
*
* Returns the number of lines advanced in the file if a line has been
* read successfully, 0 if not (e.g. EOF).
*/
int misc_get_line(FILE *f, char *buf)
{
char temp[MAX_LINE];
int lines = 0;
do {
if (fgets(temp, MAX_LINE-1, f) == NULL)
return 0;
lines++;
} while (*temp == '#' || *temp == '\n' || *temp == '\r');
temp[MAX_LINE-1] = '\0'; /* terminate in case line was too long */
misc_strip_trailing_crlfs(temp);
strcpy(buf, temp);
return lines;
}
int misc_safe_strcmp(char *s1, char *s2)
{
/* both null */
if (s1 == NULL && s2 == NULL) return 0;
/* both valid and equal */
if (s1 && s2)
return strcmp(s1, s2);
return (s1 ? 1 : -1);
}
void misc_hexdump_to_buf(buf_t *buf, char *data, int count, char *prefix)
{
int i;
char print[17];
int upper_max = (count/16)*16;
/* pad to mult of 16 */
if (count%16)
upper_max += 16;
for (i=0; i<upper_max; i++) {
if (i%16 == 0) {
memset(print, 0, sizeof(print));
bufprintf(buf, "%s %04d: ", prefix, i);
}
/* next byte */
if (i<count) {
bufprintf(buf, "%02X ", (uint8_t)data[i]);
print[i%16] = isprint(data[i]) ? data[i] : '.';
}
else
bufprintf(buf, " ");
if (i%16 == 15)
bufprintf(buf, " %s\n", print);
}
}
See more files for this project here