diff uip/annosbr.c @ 0:bce86c4163a3

Initial revision
author kono
date Mon, 18 Apr 2005 23:46:02 +0900
parents
children a6481689f99c
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uip/annosbr.c	Mon Apr 18 23:46:02 2005 +0900
@@ -0,0 +1,135 @@
+/* annosbr.c - prepend annotation to messages */
+#ifndef	lint
+static char ident[] = "@(#)$Id$";
+#endif	/* lint */
+
+#include "../h/mh.h"
+#include "../zotnet/tws.h"
+#include <errno.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+
+extern int  errno;
+off_t lseek ();
+static annosbr();
+
+/*  */
+
+annotate (file, comp, text, inplace, datesw)
+register char   *file,
+		*comp,
+		*text;
+int     inplace,
+        datesw;
+{
+    int     i,
+            fd;
+
+    if ((fd = lkopen (file, 2)) == NOTOK) {
+	switch (errno) {
+	    case ENOENT: 
+		break;
+
+	    default: 
+		admonish (file, "unable to lock and open");
+		break;
+	}
+	return 1;
+    }
+
+    i = annosbr (fd, file, comp, text, inplace, datesw);
+
+#ifndef __CYGWIN32__
+    /* cygwin32 cannot rename() my locked file. X-< */
+    (void) lkclose (fd, file);
+#endif
+
+    return i;
+}
+
+/*  */
+
+static	annosbr (src, file, comp, text, inplace, datesw)
+register char  *file,
+	       *comp,
+	       *text;
+int     src,
+	inplace,
+	datesw;
+{
+    int     mode,
+            fd;
+    register char  *cp,
+                   *sp;
+    char    buffer[BUFSIZ],
+            tmpfil[BUFSIZ];
+    struct stat st;
+    register    FILE *tmp;
+
+    mode = fstat (src, &st) != NOTOK ? (st.st_mode & 0777) : m_gmprot ();
+
+    (void) strcpy (tmpfil, m_scratch (file, "annotate"));
+
+    if ((tmp = fopen (tmpfil, "w")) == NULL) {
+	admonish (tmpfil, "unable to create");
+	return 1;
+    }
+    (void) chmod (tmpfil, mode);
+
+    if (datesw)
+	fprintf (tmp, "%s: %s\n", comp, dtimenow ());
+    if (cp = text) {
+	do {
+	    while (*cp == ' ' || *cp == '\t')
+		cp++;
+	    sp = cp;
+	    while (*cp && *cp++ != '\n')
+		continue;
+	    if (cp - sp)
+		fprintf (tmp, "%s: %*.*s", comp, cp - sp, cp - sp, sp);
+	} while (*cp);
+	if (cp[-1] != '\n' && cp != text)
+	    (void) putc ('\n', tmp);
+    }
+    (void) fflush (tmp);
+    cpydata (src, fileno (tmp), file, tmpfil);
+    (void) fclose (tmp);
+
+    if (inplace) {
+	if ((fd = open (tmpfil, 0)) == NOTOK)
+	    adios (tmpfil, "unable to open for re-reading");
+	(void) lseek (src, (off_t)0, 0);
+	cpydata (fd, src, tmpfil, file);
+	(void) close (fd);
+	(void) unlink (tmpfil);
+#ifdef __CYGWIN32__
+	(void) lkclose (src, file);
+#endif
+    }
+    else {
+	(void) strcpy (buffer, m_backup (file));
+#ifdef __CYGWIN32__
+	(void) lkclose (src, file);
+#endif
+	if (rename (file, buffer) == NOTOK) {
+	    switch (errno) {
+		case ENOENT:	/* unlinked early - no annotations */
+		    (void) unlink (tmpfil);
+		    break;
+
+		default:
+		    admonish (buffer, "unable to rename %s to", file);
+		    break;
+	    }
+	    return 1;
+	}
+	if (rename (tmpfil, file) == NOTOK) {
+	    admonish (file, "unable to rename %s to", tmpfil);
+	    return 1;
+	}
+    }
+
+    return 0;
+}