2000-06-06 09:53:49 +04:00
|
|
|
/**************************************************************************
|
|
|
|
* utils.c *
|
|
|
|
* *
|
|
|
|
* Copyright (C) 1999 Chris Allegretta *
|
|
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
|
|
* it under the terms of the GNU General Public License as published by *
|
|
|
|
* the Free Software Foundation; either version 1, or (at your option) *
|
|
|
|
* any later version. *
|
|
|
|
* *
|
|
|
|
* This program is distributed in the hope that it will be useful, *
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
|
|
* GNU General Public License for more details. *
|
|
|
|
* *
|
|
|
|
* You should have received a copy of the GNU General Public License *
|
|
|
|
* along with this program; if not, write to the Free Software *
|
|
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
|
|
|
|
* *
|
|
|
|
**************************************************************************/
|
|
|
|
|
2000-07-07 08:25:00 +04:00
|
|
|
#include <unistd.h>
|
2000-06-06 09:53:49 +04:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <ctype.h>
|
|
|
|
|
|
|
|
#include "config.h"
|
|
|
|
#include "nano.h"
|
|
|
|
#include "proto.h"
|
|
|
|
|
2000-06-21 07:00:43 +04:00
|
|
|
#ifndef NANO_SMALL
|
2000-06-19 08:22:15 +04:00
|
|
|
#include <libintl.h>
|
|
|
|
#define _(string) gettext(string)
|
|
|
|
#else
|
|
|
|
#define _(string) (string)
|
|
|
|
#endif
|
|
|
|
|
2000-06-06 09:53:49 +04:00
|
|
|
/* Lower case a string - must be null terminated */
|
|
|
|
void lowercase(char *src)
|
|
|
|
{
|
|
|
|
long i = 0;
|
|
|
|
|
|
|
|
while (src[i] != 0) {
|
|
|
|
src[i] = (char) tolower(src[i]);
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* I can't believe I have to write this function */
|
|
|
|
char *strcasestr(char *haystack, char *needle)
|
|
|
|
{
|
|
|
|
char *localneedle, *localhaystack, *found, *tmp, *tmp2;
|
|
|
|
|
|
|
|
/* Make a copy of the search string and searcgh space */
|
|
|
|
localneedle = nmalloc(strlen(needle) + 2);
|
|
|
|
localhaystack = nmalloc(strlen(haystack) + 2);
|
|
|
|
|
|
|
|
strcpy(localneedle, needle);
|
|
|
|
strcpy(localhaystack, haystack);
|
|
|
|
|
|
|
|
/* Make them lowercase */
|
|
|
|
lowercase(localneedle);
|
|
|
|
lowercase(localhaystack);
|
|
|
|
|
|
|
|
/* Look for the lowercased substring in the lowercased search space -
|
|
|
|
return NULL if we didn't find anything */
|
|
|
|
if ((found = strstr(localhaystack, localneedle)) == NULL) {
|
|
|
|
free(localneedle);
|
|
|
|
free(localhaystack);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
/* Else return the pointer to the same place in the real search space */
|
|
|
|
tmp2 = haystack;
|
|
|
|
for (tmp = localhaystack; tmp != found; tmp++)
|
|
|
|
tmp2++;
|
|
|
|
|
|
|
|
free(localneedle);
|
|
|
|
free(localhaystack);
|
|
|
|
return tmp2;
|
|
|
|
}
|
|
|
|
|
|
|
|
char *strstrwrapper(char *haystack, char *needle)
|
|
|
|
{
|
2000-07-07 08:25:00 +04:00
|
|
|
#ifdef _POSIX_VERSION
|
2000-07-07 05:49:52 +04:00
|
|
|
if (ISSET(USE_REGEXP)) {
|
|
|
|
int result=regexec(&search_regexp, haystack, 10, regmatches, 0);
|
|
|
|
if (!result)
|
|
|
|
return haystack+regmatches[0].rm_so;
|
|
|
|
return 0;
|
|
|
|
}
|
2000-07-07 08:25:00 +04:00
|
|
|
#endif
|
2000-06-06 09:53:49 +04:00
|
|
|
if (ISSET(CASE_SENSITIVE))
|
|
|
|
return strstr(haystack, needle);
|
|
|
|
else
|
|
|
|
return strcasestr(haystack, needle);
|
|
|
|
}
|
2000-06-19 08:22:15 +04:00
|
|
|
|
|
|
|
/* Thanks BG, many ppl have been asking for this... */
|
|
|
|
void *nmalloc(size_t howmuch)
|
2000-06-21 07:00:43 +04:00
|
|
|
{
|
2000-06-19 08:22:15 +04:00
|
|
|
void *r;
|
2000-06-21 07:00:43 +04:00
|
|
|
|
2000-06-19 08:22:15 +04:00
|
|
|
/* Panic save? */
|
|
|
|
|
|
|
|
if (!(r = malloc(howmuch)))
|
|
|
|
die(_("nano: malloc: out of memory!"));
|
|
|
|
|
|
|
|
return r;
|
|
|
|
}
|
2000-06-21 07:00:43 +04:00
|
|
|
|
2000-06-19 08:22:15 +04:00
|
|
|
void *nrealloc(void *ptr, size_t howmuch)
|
2000-06-21 07:00:43 +04:00
|
|
|
{
|
2000-06-19 08:22:15 +04:00
|
|
|
void *r;
|
2000-06-21 07:00:43 +04:00
|
|
|
|
2000-06-19 08:22:15 +04:00
|
|
|
if (!(r = realloc(ptr, howmuch)))
|
2000-06-21 07:00:43 +04:00
|
|
|
die("nano: realloc: out of memory!");
|
2000-06-19 08:22:15 +04:00
|
|
|
|
|
|
|
return r;
|
|
|
|
}
|
2000-07-05 02:15:39 +04:00
|
|
|
|
|
|
|
/* Append a new magic-line to filebot */
|
|
|
|
void new_magicline(void) {
|
|
|
|
filebot->next = nmalloc(sizeof(filestruct));
|
|
|
|
filebot->next->data = nmalloc(1);
|
|
|
|
filebot->next->data[0] = '\0';
|
|
|
|
filebot->next->prev = filebot;
|
|
|
|
filebot->next->next = NULL;
|
|
|
|
filebot->next->lineno = filebot->lineno + 1;
|
|
|
|
filebot = filebot->next;
|
|
|
|
totlines++;
|
|
|
|
}
|