Files
macports-ports/textproc/sand/files/sand-0.3.0.patch
Ryan Schmidt 3423a6fa40 sand: Update to 0.3.0-20021016
And fix build failures and some warnings.
2018-11-05 07:53:23 -06:00

1333 lines
34 KiB
Diff

All the changes between the last released version 0.1.1 and the most recent
code from sand.cvs.sourceforge.net.
--- ChangeLog.orig 2001-05-05 07:40:38.000000000 -0500
+++ ChangeLog 2001-12-25 14:43:10.000000000 -0600
@@ -1,3 +1,7 @@
+2001-12-25 Per Jonsson <poj@users.sourceforge.net>
+
+ * sand: Fixed bug #232977
+
2001-03-17 Per Jonsson <poj@users.sourceforge.net>
* sand: Fixed bug
--- configure.in.orig 2001-05-05 07:40:39.000000000 -0500
+++ configure.in 2002-03-31 11:47:53.000000000 -0600
@@ -2,7 +2,7 @@
AC_INIT(src/sand.c)
dnl Every other copy of the package version number gets its value from here
-AM_INIT_AUTOMAKE(sand, 0.1.1)
+AM_INIT_AUTOMAKE(sand, 0.3)
AC_SUBST(VERSION)
@@ -25,8 +25,11 @@
dnl Checks for library functions.
AC_REPLACE_FUNCS(getline)
-AC_CHECK_FUNCS(fgetln)
AC_REPLACE_FUNCS(error)
+AC_REPLACE_FUNCS(strndup)
+
+AC_REPLACE_FUNCS(asprintf)
+
AC_OUTPUT(Makefile src/Makefile doc/Makefile sand.lsm sand.spec)
--- doc/sand.1.orig 2001-05-05 08:09:10.000000000 -0500
+++ doc/sand.1 2002-10-16 13:44:14.000000000 -0500
@@ -13,7 +13,7 @@
.\" along with this program; see the file COPYING. If not, write to
.\" the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
.\"
-.TH SAND 1 "May 5, 2001"
+.TH SAND 1 "June 14, 2002"
.\" Please update the above date whenever this man page is modified.
.\"
.\" Some roff macros, for reference:
@@ -45,6 +45,10 @@
.TP
.B \-n \fIID\fB, \-\-note\fR=\fIID
Choose what note to output.
+This option implies \-\-output-text.
+.TP
+.B \-l, \-\-list
+Lists all the notes in the diary for use with the \fB-n\fP option.
.TP
.B \-v, \-\-verbose
Print more information.
--- doc/sand.texinfo.orig 2001-05-05 08:12:15.000000000 -0500
+++ doc/sand.texinfo 2002-10-16 13:44:15.000000000 -0500
@@ -6,12 +6,12 @@
@setchapternewpage odd
@c %**end of header
-@set VERSION 0.1.1
+@set VERSION 0.3.0
@ifinfo
This file documents the @code{sand} command which helps you keep your diary
-Copyright (C) 2001 Per Jonsson
+Copyright (C) 2001, 2002 Per Jonsson
Permission is granted to make and distribute verbatim copies of
this manual provided the copyright notice and this permission notice
@@ -44,7 +44,7 @@
@page
@vskip 0pt plus 1filll
-Copyright @copyright{} 2001 Per Jonsson
+Copyright @copyright{} 2001, 2002 Per Jonsson
Permission is granted to make and distribute verbatim copies of
this manual provided the copyright notice and this permission notice
@@ -58,7 +58,7 @@
Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions,
except that this permission notice may be stated in a translation approved
-by the Foundation.
+by the Free Software Foundation.
@end titlepage
@c All the nodes can be updated using the EMACS command
@@ -135,6 +135,8 @@
only affects output modes
zero based
+ -l, --list displays a list of all notes in the diary
+
-v, --verbose print more information
-h, --help display this help and exit
-V, --version output version information and exit
@@ -170,6 +172,11 @@
@itemx -n @var{id}
Choose note with number @var{id} as the note to output with
@code{--output-text}
+This option also implies the @code{--output-text} option.
+
+@item --list
+@itemx -l
+Lists all the notes in the diary.
@item --verbose
@itemx -V
@@ -188,8 +195,7 @@
@node Known Problems, Problems, Invoking sand, Top
@chapter Known Problems
@cindex problems, known
-At the moment @code{sand} doesn't produce very much useful output,
-it just takes input and stores it.
+No great ones at the moment
@node Problems, Concept Index, Known Problems, Top
--- src/Makefile.am.orig 2001-05-05 07:43:20.000000000 -0500
+++ src/Makefile.am 2002-02-08 14:44:23.000000000 -0600
@@ -1,10 +1,11 @@
INCLUDES = -I$(top_srcdir)
+CFLAGS= @CFLAGS@ -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align
+
LDADD = @LIBOBJS@
bin_PROGRAMS=sand
+sand_SOURCES=sand.c sand.h cli.c cli.h xmalloc.c system.h getopt.c getopt1.c getopt.h ddecode.c ddecode.h dencode.c output-diary.c output-text.c output.h repl_func.h extra.c mdiary.c mdiary.h
-sand_SOURCES=sand.c sand.h cli.c cli.h xmalloc.c system.h getopt.c getopt1.c getopt.h ddecode.c ddecode.h dencode.c output-diary.c output-text.c output.h repl_func.h extra.c
-
-EXTRA_DIST = getline.c error.c
+EXTRA_DIST = getline.c error.c strndup.c asprintf.c
--- src/asprintf.c.orig 1969-12-31 18:00:00.000000000 -0600
+++ src/asprintf.c 2002-07-12 15:27:10.000000000 -0500
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2001 Federico Di Gregorio <fog@debian.org>
+ * Copyright (C) 1991, 1994-1999, 2000, 2001 Free Software Foundation, Inc.
+ *
+ * This code has been derived from an example in the glibc2 documentation.
+ * This file is part of the psycopg module.
+ *
+ * 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 2,
+ * 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * asprintf.c -- asprintf() implementation for braindamaged operating systems
+ * $Id: asprintf.c,v 1.1 2002/07/12 20:27:10 poj Exp $
+ */
+
+#include <unistd.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/time.h>
+#include <stdlib.h>
+
+int
+asprintf(char **buffer, char *fmt, ...)
+{
+ /* Guess we need no more than 200 chars of space. */
+ int size = 200;
+ int nchars;
+ va_list ap;
+
+ *buffer = (char*)malloc(size);
+ if (*buffer == NULL) return -1;
+
+ /* Try to print in the allocated space. */
+ va_start(ap, fmt);
+ nchars = vsnprintf(*buffer, size, fmt, ap);
+ va_end(ap);
+
+ if (nchars >= size)
+ {
+ char *tmpbuff;
+ /* Reallocate buffer now that we know how much space is needed. */
+ size = nchars+1;
+ tmpbuff = (char*)realloc(*buffer, size);
+
+
+ if (tmpbuff == NULL) { /* we need to free it*/
+ free(*buffer);
+ return -1;
+ }
+
+ *buffer=tmpbuff;
+ /* Try again. */
+ va_start(ap, fmt);
+ nchars = vsnprintf(*buffer, size, fmt, ap);
+ va_end(ap);
+ }
+
+ if (nchars < 0) return nchars;
+ return size;
+}
--- src/cli.c.orig 2001-03-16 09:47:58.000000000 -0600
+++ src/cli.c 2002-07-12 15:27:10.000000000 -0500
@@ -29,26 +29,18 @@
#include "output.h"
#include "sand.h"
+
/* cli_output - output of a text in cli mode*/
+/* MDIARY */
void cli_output()
{
+ mdiary d;
dnote note;
- dinfo diary;
- /* Set it up for output */
- input_diary(&diary);
- if (ddecode_init(&diary)!= DIARY_IS)
- {
- message_err("Diary-file isn't a diary");
- exit (EXIT_FAILURE);
- }
- note = ddecode_note(&diary, note_number);
+ d = init_mdiary_file(get_diary_file_name());
+ note = mdiary_note(&d, note_number);
switch (note.length)
{
- case ERR_INV_FORMAT:
- message_err("Your Diary is in a corrupt format.\nExiting...\n");
- exit(EXIT_FAILURE);
- break;
case ERR_NO_SUCH_NOTE:
message_err("The Note you request from the diary isn't available\n");
message_err("Please try another\n");
@@ -59,44 +51,60 @@
}
out_text_fputnote(note, stdout);
- free(diary.text);
}
/* cli_dump - handles the dumping in case of cli mode */
+/* MDIARY */
void cli_dump()
{
- int j;
+ mdiary d;
dnote note;
- dinfo diary;
+ int nmbr = 0;
+ int cont = 1;
+
+ d = init_mdiary_file(get_diary_file_name());
- /* Set it up for dumping */
- input_diary(&diary);
- if (ddecode_init(&diary)!= DIARY_IS)
- {
- message_err("Diary-file isn't a diary");
- exit (EXIT_FAILURE);
- }
-
- j = 0;
do {
- note = ddecode_note_next(&diary);
+ note = mdiary_note(&d, nmbr);
switch (note.length)
{
- case ERR_INV_FORMAT:
- message_err("Your Diary is in a corrupt format.\nExiting...\n");
- exit(EXIT_FAILURE);
- break;
case ERR_NO_SUCH_NOTE:
- j = ERR_NO_SUCH_NOTE;
+ cont = 0;
break;
default:
out_text_fputnote(note, stdout);
break;
}
- } while (j != ERR_NO_SUCH_NOTE);
-
- free(diary.text);
-
+ nmbr++;
+ } while (cont == 1);
+
+}
+
+/* cli_list - lists the notes in the diary */
+/* MDIARY */
+void cli_list()
+{
+ mdiary d;
+ dnote note;
+ int nmbr = 0;
+ int cont = 1;
+
+ d = init_mdiary_file(get_diary_file_name());
+
+ do {
+ note = mdiary_note(&d, nmbr);
+ switch (note.length)
+ {
+ case ERR_NO_SUCH_NOTE:
+ cont = 0;
+ break;
+ default:
+ out_text_fputsummary(note, stdout, nmbr);
+ break;
+ }
+ nmbr++;
+ } while (cont == 1);
+
}
/* cli_input - handles the input case of cli mode*/
@@ -246,7 +254,7 @@
}
-
+/* cli_getline - specialized getline variant */
ssize_t cli_getline(char **LINEPTR, size_t *N, FILE *STREAM)
{
ssize_t char_read;
@@ -272,3 +280,37 @@
return char_read;
}
+/* cli_main - main when compiled in cli mode */
+int cli_main(int argc, char **argv)
+{
+ int i,j;
+ unsigned char status;
+
+ program_name = argv[0];
+
+ i = decode_switches (argc, argv);
+
+ /* Set up some configuration parsing */
+ status = sand_config();
+
+ if (want_output_text){
+ cli_output();
+ } else if (want_dump_text){
+ cli_dump();
+ } else if (want_list) {
+ cli_list();
+ } else if (want_note) {
+ message_ver("Got note parameter but no output option. Defaulting to output-text\n",1);
+ cli_output();
+ } else {
+ /* Normal input loop */
+ cli_input(status);
+ }
+
+ exit (0);
+
+}
+
+
+
+
--- src/cli.h.orig 2001-03-11 13:38:24.000000000 -0600
+++ src/cli.h 2001-12-17 13:21:56.000000000 -0600
@@ -28,4 +28,6 @@
void cli_dump();
void cli_input(int status);
+int cli_main(int argc, char **argv);
+
#endif
--- src/ddecode.c.orig 2001-05-05 07:40:42.000000000 -0500
+++ src/ddecode.c 2001-12-17 13:21:56.000000000 -0600
@@ -56,20 +56,20 @@
}
/* ddecode_find_tag searches for a tag in the diary */
-int ddecode_find_tag(const dinfo d, const char * t)
+int ddecode_find_tag(dinfo * d, const char * t)
{
int i,j,f;
f = strlen(t);
/* Loop to find <note> */
- for (i = 0; i < (d.length - d.position - f); i++)
+ for (i = 0; i < (d->length - d->position - f); i++)
{
j=-1;
- if (strncasecmp ((d.text + (d.position+i)), t ,f ) == 0)
+ if (strncasecmp ((d->text + (d->position+i)), t ,f ) == 0)
{
j = i;
- i = d.length;
+ i = d->length;
}
}
return j;
@@ -97,7 +97,7 @@
/* Search for the note:th <note> tag */
for (i=0; i <= note; i++)
{
- j=ddecode_find_tag(*d, "<note>");
+ j=ddecode_find_tag(d, "<note>");
d->position += ((j>0)?(j+6):(0));
}
@@ -110,7 +110,7 @@
}
/* Find the date */
- date_pos = ddecode_find_tag(*d,"<date>");
+ date_pos = ddecode_find_tag(d,"<date>");
if ( date_pos == -1)
{
d_note.length = ERR_INV_FORMAT;
@@ -119,7 +119,7 @@
}
/* Find end of date information */
- j = ddecode_find_tag(*d,"</date>");
+ j = ddecode_find_tag(d,"</date>");
if ( j == -1)
{
d_note.length = ERR_INV_FORMAT;
@@ -128,7 +128,7 @@
}
/* Decode the date */
- if (ddecode_date(*d, &d_note, date_pos, j - date_pos)== -1)
+ if (ddecode_date(d, &d_note, date_pos, j - date_pos)!= DATE_OK)
{
d_note.length = ERR_INV_FORMAT;
d->position = pos;
@@ -136,11 +136,11 @@
}
/* Locate the title of the not if there is one */
- title_start = ddecode_find_tag(*d,"<title>");
+ title_start = ddecode_find_tag(d,"<title>");
if ( title_start != -1)
{
/* If the title is opened, an end is required. */
- title_end = ddecode_find_tag(*d,"</title>");
+ title_end = ddecode_find_tag(d,"</title>");
if ( title_end == -1)
{
d_note.length = ERR_INV_FORMAT;
@@ -153,7 +153,7 @@
}
/* Find the position of the body */
- j = ddecode_find_tag(*d,"<body>");
+ j = ddecode_find_tag(d,"<body>");
if ( j == -1)
{
d_note.length = ERR_INV_FORMAT;
@@ -163,7 +163,7 @@
d->position += j + 6;
/* Find the end of the body */
- d_note.length = ddecode_find_tag(*d,"</body>");
+ d_note.length = ddecode_find_tag(d,"</body>");
if ( d_note.length == -1)
{
d_note.length == ERR_INV_FORMAT;
@@ -172,7 +172,7 @@
}
/* Find the end of note tag */
- j = ddecode_find_tag(*d,"</note>");
+ j = ddecode_find_tag(d,"</note>");
if ( j == -1)
{
d_note.length = ERR_INV_FORMAT;
@@ -187,7 +187,7 @@
if ((d->position > title_start) && (title_end > 0))
{
/* Now, Lets take care of the title */
- d_note.title = strndup((d->text + title_start + strlen("<title>")),
+ d_note.title = (char*)strndup((d->text + title_start + strlen("<title>")),
title_end);
} else {
d_note.title = (char *) NULL;
@@ -198,23 +198,26 @@
/* ddecode_date decodes the date */
-int ddecode_date(const dinfo d, dnote * n, int p, int e)
+int ddecode_date(dinfo * d, dnote * n, int p, int e)
{
char bck[5];
char * temp;
+ char * ltemp;
int p_org = p;
int i = 0;
- while (isspace (d.text[p + d.position + 6]))
+ ltemp = (char *)strndup((d->text + d->position), (e + 1));
+
+ while (isspace (ltemp[p + 6]))
p++;
- bck[0] = d.text[p_org + d.position + e];
- d.text[p_org + d.position + e] = '\0';
- bck[1] = d.text[p_org + d.position + e - 1];
+ bck[0] = ltemp[p_org + e];
+ ltemp[p_org + e] = '\0';
+ bck[1] = ltemp[p_org + e - 1];
if (!isdigit(bck[1]))
- d.text[p_org + d.position + e - 1] = '\0';
+ ltemp[p_org + e - 1] = '\0';
- temp = d.text + p + d.position + 6;
+ temp = ltemp + p + 6;
/* YEAR */
if (isdigit(temp[0]) && isdigit(temp[1]) &&
@@ -223,8 +226,7 @@
bck[2] = temp[4];
temp[4] = '\0';
} else {
- d.text[p_org + d.position + e] = bck[0];
- d.text[p_org + d.position + e - 1] = bck[1];
+ free (ltemp);
return ERR_INV_FORMAT;
}
@@ -240,8 +242,7 @@
bck[2] = temp[2];
temp[2] = '\0';
} else {
- d.text[p_org + d.position + e] = bck[0];
- d.text[p_org + d.position + e - 1] = bck[1];
+ free (ltemp);
return ERR_INV_FORMAT;
}
@@ -260,8 +261,7 @@
bck[2] = temp[2];
temp[2] = '\0';
} else {
- d.text[p_org + d.position + e] = bck[0];
- d.text[p_org + d.position + e - 1] = bck[1];
+ free (ltemp);
return ERR_INV_FORMAT;
}
@@ -292,8 +292,7 @@
temp[5] = '\0';
temp[8] = '\0';
} else {
- d.text[p_org + d.position + e] = bck[0];
- d.text[p_org + d.position + e - 1] = bck[1];
+ free (ltemp);
return ERR_INV_FORMAT;
}
@@ -318,9 +317,8 @@
temp[5] = bck[3];
temp[8] = bck[4];
- d.text[p_org + d.position + e] = bck[0];
- d.text[p_org + d.position + e - 1] = bck[1];
+ free (ltemp);
return DATE_OK;
}
--- src/ddecode.h.orig 2001-05-05 07:40:42.000000000 -0500
+++ src/ddecode.h 2001-12-17 13:21:56.000000000 -0600
@@ -26,6 +26,7 @@
typedef struct diary_base{
size_t length;
+ int fd;
int position;
char * text;
} dinfo;
@@ -61,7 +62,7 @@
dnote ddecode_note(dinfo * d, int note);
dnote ddecode_note_next(dinfo * d);
int ddecode_init(dinfo * diary);
-int ddecode_date(const dinfo d, dnote * n, int p, int e);
+int ddecode_date(dinfo * d, dnote * n, int p, int e);
dtime time_t2dtime(time_t t);
--- src/getline.c.orig 2001-03-17 12:48:34.000000000 -0600
+++ src/getline.c 2002-02-08 14:44:23.000000000 -0600
@@ -1,50 +1,143 @@
-/*
- getline.c - Replacement for getline
+/* getline.c -- Replacement for GNU C library function getline
- Copyright (C) 2001 Per Jonsson
+Copyright (C) 1993 Free Software Foundation, Inc.
- 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 2, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
+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 2 of the
+License, or (at your option) any later version.
-#include <stdio.h>
-#include "repl_func.h"
+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. */
+
+/* Written by Jan Brittenson, bson@gnu.ai.mit.edu. */
-char *xmalloc ();
-char *xrealloc ();
-char *xstrdup ();
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
-ssize_t
-getline_fgetln (char **lineptr, size_t *n, FILE *stream)
+#include <sys/types.h>
+#include <stdio.h>
+#include <assert.h>
+#include <errno.h>
+
+#if STDC_HEADERS
+#include <stdlib.h>
+#else
+char *malloc (), *realloc ();
+#endif
+
+/* Always add at least this many bytes when extending the buffer. */
+#define MIN_CHUNK 64
+
+/* Read up to (and including) a TERMINATOR from STREAM into *LINEPTR
+ + OFFSET (and null-terminate it). *LINEPTR is a pointer returned from
+ malloc (or NULL), pointing to *N characters of space. It is realloc'd
+ as necessary. Return the number of characters read (not including the
+ null terminator), or -1 on error or EOF. On a -1 return, the caller
+ should check feof(), if not then errno has been set to indicate
+ the error. */
+
+int getstr (lineptr, n, stream, terminator, offset)
+ char **lineptr;
+ size_t *n;
+ FILE *stream;
+ char terminator;
+ int offset;
{
- char *line;
- size_t len;
-
- line = fgetln(stream, &len);
- if (!line)
- return -1;
- if (len >= *n) {
- char *tmp;
-
- /* XXX some realloc() implementations don`t set errno */
- tmp = realloc(*lineptr, len + 1);
- if (!tmp)
+ int nchars_avail; /* Allocated but unused chars in *LINEPTR. */
+ char *read_pos; /* Where we're reading into *LINEPTR. */
+ int ret;
+
+ if (!lineptr || !n || !stream)
+ {
+ errno = EINVAL;
return -1;
- *lineptr = tmp;
- *n = len + 1;
- }
- memcpy(*lineptr, line, len);
- (*lineptr)[len] = 0;
- return len;
+ }
+
+ if (!*lineptr)
+ {
+ *n = MIN_CHUNK;
+ *lineptr = malloc (*n);
+ if (!*lineptr)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ }
+
+ nchars_avail = *n - offset;
+ read_pos = *lineptr + offset;
+
+ for (;;)
+ {
+ int save_errno;
+ register int c = getc (stream);
+
+ save_errno = errno;
+
+ /* We always want at least one char left in the buffer, since we
+ always (unless we get an error while reading the first char)
+ NUL-terminate the line buffer. */
+
+ assert((*lineptr + *n) == (read_pos + nchars_avail));
+ if (nchars_avail < 2)
+ {
+ if (*n > MIN_CHUNK)
+ *n *= 2;
+ else
+ *n += MIN_CHUNK;
+
+ nchars_avail = *n + *lineptr - read_pos;
+ *lineptr = realloc (*lineptr, *n);
+ if (!*lineptr)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ read_pos = *n - nchars_avail + *lineptr;
+ assert((*lineptr + *n) == (read_pos + nchars_avail));
+ }
+
+ if (ferror (stream))
+ {
+ /* Might like to return partial line, but there is no
+ place for us to store errno. And we don't want to just
+ lose errno. */
+ errno = save_errno;
+ return -1;
+ }
+
+ if (c == EOF)
+ {
+ /* Return partial line, if any. */
+ if (read_pos == *lineptr)
+ return -1;
+ else
+ break;
+ }
+
+ *read_pos++ = c;
+ nchars_avail--;
+
+ if (c == terminator)
+ /* Return the line. */
+ break;
+ }
+
+ /* Done - NUL terminate and return the number of chars read. */
+ *read_pos = '\0';
+
+ ret = read_pos - (*lineptr + offset);
+ return ret;
+}
+
+int getline (lineptr, n, stream)
+ char **lineptr;
+ size_t *n;
+ FILE *stream;
+{
+ return getstr (lineptr, n, stream, '\n', 0);
}
--- src/mdiary.c.orig 1969-12-31 18:00:00.000000000 -0600
+++ src/mdiary.c 2002-03-31 11:47:53.000000000 -0600
@@ -0,0 +1,192 @@
+/*
+ sand - helps you keep your diary
+
+ mdiary.c - handles diary in memory
+
+ Copyright (C) 2001 Per Jonsson
+
+ 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 2, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <unistd.h>
+#include <getopt.h>
+#include <string.h>
+#include "system.h"
+#include "ddecode.h"
+#include "output.h"
+#include "sand.h"
+#include "mdiary.h"
+
+/* input_diary_generic - reads an entire diary into memory */
+dinfo * input_diary_generic(dinfo * diary_ret, char * s)
+{
+ int diary = 0; /* fd to diary */
+ char * diary_p = (char *)NULL; /* PATH to diary */
+ char * temp = (char *)NULL;
+ int diarylen = 0; /* Misc uses concerning length of diary */
+ ssize_t nc = (ssize_t) 0;
+ size_t length = 0;
+ size_t diary_size = (size_t) 0;
+ struct stat dstat;
+
+ diary_ret->text = (char*) NULL;
+ diary_ret->length = 0;
+ diary_ret->position = 0;
+
+ /* Open the file for reading */
+ diary = open(s, O_RDONLY);
+
+ diary_ret->fd = diary;
+ /* Do some error checking on the FILE * */
+ if (diary == (int)NULL)
+ {
+
+ if (errno == EINVAL){
+ /* The system isn't handling my mode, exiting */
+ perror("sand");
+ exit (EXIT_FAILURE);
+ }
+
+ /* Something else is wrong, exit */
+ perror("sand");
+ exit(EXIT_FAILURE);
+ }
+
+ if (fstat(diary, &dstat) == -1)
+ {
+ message_err("BAAAD failure when doing fstat on diary\n");
+ perror("sand");
+ exit(EXIT_FAILURE);
+ }
+
+ diary_ret->text = mmap (NULL, dstat.st_size, PROT_READ, MAP_SHARED, diary,0);
+
+ length = dstat.st_size;
+ if (diary_ret->text == (char *)-1)
+ {
+ /* Oops, the memorymapping failed */
+ message_err("BAAD failure when mmaping\n");
+ perror("sand");
+ exit(EXIT_FAILURE);
+ }
+
+ diary_ret->length = length;
+
+ return diary_ret;
+}
+
+/* init_mdiary_file - initializes a mdiary from a file, populates node list */
+mdiary init_mdiary_file(char * s)
+{
+ mdiary ret;
+ mnote_list * cur;
+ mnote_list * latest;
+ FILE * d;
+ dinfo t_diary;
+ int dsize = 0;
+ int nc = 0;
+ int cont = 1;
+
+ input_diary_generic(&t_diary, s);
+
+ if ( ddecode_init(&t_diary) != DIARY_IS)
+ {
+ message_err("I haven't got a diary.\nExiting\n");
+ fclose (d);
+ exit (EXIT_FAILURE); /* Escape from the program */
+ }
+
+ ret.first = (mnote_list*)xmalloc(sizeof(mnote_list));
+ ret.first->next = (mnote_list*)NULL;
+
+ cur = ret.first;
+ cur->next = ret.first;
+
+ latest = cur;
+
+ do {
+ cur->next->d = ddecode_note(&t_diary, DIARY_NEXT_NOTE);
+ latest = cur;
+ cur = cur->next;
+
+ cur->next = (mnote_list*)xmalloc(sizeof(mnote_list));
+ cur->next->next = (mnote_list*)NULL;
+ if(cur->d.length == ERR_NO_SUCH_NOTE) {
+ cont = 0;
+ } else if (cur->d.length == ERR_INV_FORMAT) {
+ message_err("Invalid diary format\n");
+ fclose (d);
+ exit (EXIT_FAILURE); /* Escape from the program */
+ }
+ } while (cont);
+
+ free(cur->next);
+ if (cur != latest )
+ free(latest->next);
+ latest->next = (mnote_list*)NULL;
+
+ /*close_diary(&t_diary); */
+
+ return ret;
+}
+
+/* close_diary - close a dinfo diary */
+void close_diary (dinfo * d)
+{
+ munmap(d->text, d->length);
+ close(d->fd);
+
+ memset(&d, '\0', sizeof(dinfo));
+}
+
+/* mdiary_note - returns a specific note in the mdiary */
+dnote mdiary_note(mdiary * d, int number)
+{
+ dnote n;
+ mnote_list * cur;
+
+ memset(&n, '\0', sizeof(n));
+
+ cur = d->first;
+
+ do {
+ if((number == 0) || (cur->next == (mnote_list *)NULL))
+ {
+ if (number == 0)
+ {
+ n = cur->d;
+ } else {
+ n.length = ERR_NO_SUCH_NOTE;
+ number = 0;
+ }
+ } else {
+ cur = cur->next;
+ }
+ number--;
+ } while ( number >= 0);
+
+
+ return n;
+}
+
+
+
+
+
--- src/mdiary.h.orig 1969-12-31 18:00:00.000000000 -0600
+++ src/mdiary.h 2001-12-25 07:09:42.000000000 -0600
@@ -0,0 +1,46 @@
+/*
+ sand - helps you keep your diary
+
+ mdiary.h - handles diary in memory
+
+ Copyright (C) 2001 Per Jonsson
+
+ 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 2, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+#ifndef __SAND__MDIARY_H__
+#define __SAND__MDIARY_H__
+#include "ddecode.h"
+
+typedef struct diary_note_list{
+ dnote d;
+ struct diary_note_list * next;
+} mnote_list;
+
+typedef struct diary_mem{
+ FILE * fd;
+ mnote_list * first;
+} mdiary;
+
+
+dinfo * input_diary_generic(dinfo * diary_ret, char * s);
+mdiary init_mdiary_file(char * s);
+dnote mdiary_note(mdiary * d, int number);
+
+
+#endif
+
+
--- src/output-text.c.orig 2001-05-05 07:40:44.000000000 -0500
+++ src/output-text.c 2001-12-25 12:59:32.000000000 -0600
@@ -63,3 +63,27 @@
fprintf(to, "\n\n");
}
+
+
+/* out_text_fputsummary - outputs note summary in plain text format to file */
+int out_text_fputsummary(dnote d, FILE * to, int id)
+{
+ int j;
+ char * date;
+
+ date = dencode_date(d);
+ j = strlen(date);
+
+ fprintf(to, "%5i ", id);
+
+ fprintf(to, "%s ",date);
+
+ if (d.title != (char *) NULL)
+ {
+ j = strlen(d.title);
+ fprintf(to, "%s",d.title);
+ }
+
+ fprintf(to, "\n");
+
+}
--- src/output.h.orig 2001-05-05 07:32:03.000000000 -0500
+++ src/output.h 2001-12-25 12:59:32.000000000 -0600
@@ -29,5 +29,6 @@
int out_diary_special_fputnote(dnote d, FILE * to, FILE * source);
int out_text_fputnote(dnote d, FILE * to);
+int out_text_fputsummary(dnote d, FILE * to, int id);
#endif
--- src/repl_func.h.orig 2001-03-17 12:48:34.000000000 -0600
+++ src/repl_func.h 2002-02-08 14:44:23.000000000 -0600
@@ -24,10 +24,7 @@
/* getline */
#ifndef HAVE_GETLINE
-#ifdef HAVE_FGETLN
-#define getline_fgetln getline
-ssize_t getline_fgetln (char **lineptr, size_t *n, FILE *stream);
-#endif
+int getline (char **lineptr, size_t n, FILE * stream);
#endif
/* error */
@@ -37,4 +34,9 @@
#include <error.h>
#endif
+
+/* strndup */
+#ifndef HAVE_STRNDUP
+char * strndup(const char * s, size_t n);
+#endif
#endif
--- src/sand.c.orig 2001-05-05 07:40:47.000000000 -0500
+++ src/sand.c 2001-12-25 12:59:32.000000000 -0600
@@ -25,6 +25,7 @@
*/
#define __SAND_C__SAND__
+#define SAND_CLI
#include <stdio.h>
#include <sys/types.h>
@@ -71,37 +72,19 @@
{NULL, 0, NULL, 0}
};
-static int decode_switches (int argc, char **argv);
int
main (int argc, char **argv)
{
- int i,j;
- unsigned char status;
-
- program_name = argv[0];
-
- i = decode_switches (argc, argv);
-
- /* Set up some configuration parsing */
- status = sand_config();
-
- if (want_output_text){
- cli_output();
- } else if (want_dump_text){
- cli_dump();
- } else {
- /* Normal input loop */
- cli_input(status);
- }
-
- exit (0);
+#ifdef SAND_CLI
+ cli_main(argc, argv);
+#endif
}
/* Set all the option flags according to the switches specified.
Return the index of the first non-option argument. */
-static int
+int
decode_switches (int argc, char **argv)
{
int c;
@@ -167,6 +150,8 @@
only affects output modes\n\
zero based\n\
\n\
+ -l, --list displays a list of all notes in the diary\n\
+\n\
-v, --verbose print more information\n\
-h, --help display this help and exit\n\
-V, --version output version information and exit\n\
@@ -185,74 +170,6 @@
return 0;
}
-
-/* input_diary - reads an entire diary into memory */
-dinfo * input_diary(dinfo * diary_ret)
-{
- FILE * diary = (FILE *) NULL; /* FILE * to diary */
- char * diary_p = (char *)NULL; /* PATH to diary */
- char * temp = (char *)NULL;
- int diarylen = 0; /* Misc uses concerning length of diary */
- ssize_t nc = (ssize_t) 0;
- size_t length = 0;
- size_t diary_size = (size_t) 0;
-
- diary_ret->text = (char*) NULL;
- diary_ret->length = 0;
- diary_ret->position = 0;
-
- /* Open the file for reading */
- diary = fopen(get_diary_file_name(), "r");
-
- /* Do some error checking on the FILE * */
- if (diary == NULL)
- {
-
- if (errno == EINVAL){
- /* The system isn't handling my mode, exiting */
- perror("sand");
- exit (EXIT_FAILURE);
- }
-
- /* Something else is wrong, exit */
- perror("sand");
- exit(EXIT_FAILURE);
- }
-
- /* Loop until the whole diary is read */
- do {
-
- /* Read the line */
- nc = getline( &diary_p, &diary_size, diary);
-
- /* If char_read == -1 then we probabably have read until EOF */
- if (nc == -1)
- {
- if (!feof(diary)) /* Everything that is error except */
- { /* EOF is evil */
- message_err("Evil input from diary file\nExiting....\n");
- fclose (diary);
- exit (EXIT_FAILURE); /* Escape from the program */
- }
- } else {
- temp = xrealloc(temp, length + nc + 1);
- diary_ret->text = temp;
-
- temp = temp + length;
- memcpy(temp, diary_p, nc);
-
- length += nc;
- temp = diary_ret->text;
- }
- } while ( nc != -1 );
-
- diary_ret->length = length;
-
- fclose(diary);
- return diary_ret;
-}
-
-
/* get_diary_file_name - returns the filename of the diary */
char * get_diary_file_name()
{
--- src/sand.h.orig 2001-03-16 09:52:07.000000000 -0600
+++ src/sand.h 2002-02-08 14:44:23.000000000 -0600
@@ -32,6 +32,7 @@
#include "ddecode.h"
#include "output.h"
#include "cli.h"
+#include "mdiary.h"
#define EXIT_OK 0
#define EXIT_FAILURE 1
@@ -48,6 +49,7 @@
void message_ver (char * msg, int msg_mode);
static void message (char * msg) { message_ver(msg, 0);}
+static void vmessage (char * msg) { message_ver(msg, 1);}
void message_err (char * msg);
unsigned char sand_config();
@@ -56,9 +58,17 @@
void get_create_rc_dir();
char * get_diary_file_name();
-dinfo * input_diary(dinfo *diary_ret);
FILE * open_diary(int mode);
int dump_file(FILE * from, FILE * to);
+void close_diary (dinfo * d);
+
+int decode_switches (int argc, char **argv);
+
+/* input_diary - wrapper to handle old style behaviour of input_diary */
+static inline dinfo * input_diary(dinfo * diary_ret)
+{
+ return input_diary_generic(diary_ret, get_diary_file_name());
+}
#ifndef __SAND_C__SAND__
/* The name the program was run with, stripped of any leading path. */
@@ -70,10 +80,11 @@
/* The program home dir */
extern char *program_home;
-extern int want_verbose; /* --verbose */
+extern int want_verbose; /* --verbose */
extern int want_output_text; /* --output-text */
extern int want_dump_text; /* --dump-text */
extern int want_note; /* --note */
+extern int want_list; /* --list */
extern int note_number;
#endif
--- src/strndup.c.orig 1969-12-31 18:00:00.000000000 -0600
+++ src/strndup.c 2002-02-08 14:44:23.000000000 -0600
@@ -0,0 +1,42 @@
+/*
+ strndup.c - Replacement for strndup
+
+ Copyright (C) 2001 Stefan Kost
+ Copyright (C) 2001 Per Jonsson
+
+ 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 2, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include <stdio.h>
+#include "repl_func.h"
+
+char *xmalloc ();
+char *xrealloc ();
+char *xstrdup ();
+
+char * strndup(const char * s, size_t n)
+{
+ char *d;
+ if(strlen(s)<n)
+ {
+ d=xstrdup(s);
+ } else {
+ d=xmalloc(n+1);
+ strncpy(d,s,n+1);
+ d[n]='\0';
+ }
+ return(d);
+}
+