changeset 1030:d4bc24e6a281 v7.0.156

updated for version 7.0-156
author vimboss
date Wed, 01 Nov 2006 17:12:57 +0000
parents 82b2594be408
children 1780e6046802
files src/feature.h src/mbyte.c src/memfile.c src/memline.c src/os_amiga.c src/os_amiga.h src/pty.c src/version.c
diffstat 8 files changed, 164 insertions(+), 46 deletions(-) [+]
line wrap: on
line diff
--- a/src/feature.h
+++ b/src/feature.h
@@ -1133,7 +1133,7 @@
 /*
  * +ARP			Amiga only. Use arp.library, DOS 2.0 is not required.
  */
-#ifndef NO_ARP
+#if !defined(NO_ARP) && !defined(__amigaos4__)
 # define FEAT_ARP
 #endif
 
--- a/src/mbyte.c
+++ b/src/mbyte.c
@@ -667,7 +667,7 @@ codepage_invalid:
 	     * API */
 	    n = IsDBCSLeadByteEx(enc_dbcs, (BYTE)i) ? 2 : 1;
 #else
-# ifdef MACOS
+# if defined(MACOS) || defined(__amigaos4__)
 	    /*
 	     * if mblen() is not available, character which MSB is turned on
 	     * are treated as leading byte character. (note : This assumption
--- a/src/memfile.c
+++ b/src/memfile.c
@@ -655,7 +655,7 @@ mf_sync(mfp, flags)
 # endif
 #endif
 #ifdef AMIGA
-# ifdef __AROS__
+# if defined(__AROS__) || defined(__amigaos4__)
 	if (fsync(mfp->mf_fd) != 0)
 	    status = FAIL;
 # else
--- a/src/memline.c
+++ b/src/memline.c
@@ -55,10 +55,14 @@
 # include <time.h>
 #endif
 
-#ifdef SASC
+#if defined(SASC) || defined(__amigaos4__)
 # include <proto/dos.h>	    /* for Open() and Close() */
 #endif
 
+#ifdef HAVE_ERRNO_H
+# include <errno.h>
+#endif
+
 typedef struct block0		ZERO_BL;    /* contents of the first block */
 typedef struct pointer_block	PTR_BL;	    /* contents of a pointer block */
 typedef struct data_block	DATA_BL;    /* contents of a data block */
@@ -4481,7 +4485,7 @@ ml_updatechunk(buf, line, len, updtype)
     curchnk = buf->b_ml.ml_chunksize + curix;
 
     if (updtype == ML_CHNK_DELLINE)
-	len *= -1;
+	len = -len;
     curchnk->mlcs_totalsize += len;
     if (updtype == ML_CHNK_ADDLINE)
     {
--- a/src/os_amiga.c
+++ b/src/os_amiga.c
@@ -30,20 +30,31 @@
 # include <exec/types.h>
 # include <exec/exec.h>
 # include <libraries/dos.h>
-# include <libraries/dosextens.h>
 # include <intuition/intuition.h>
-#else
-# include <proto/dos.h>
-# include <libraries/dosextens.h>
-# include <proto/intuition.h>
-# include <proto/exec.h>
 #endif
 
+/* XXX These are included from os_amiga.h
+#include <proto/exec.h>
+#include <proto/dos.h>
+#include <proto/intuition.h>
+*/
+
 #include <exec/memory.h>
+#include <libraries/dosextens.h>
 
 #include <dos/dostags.h>	    /* for 2.0 functions */
 #include <dos/dosasl.h>
 
+/* From version 4 of AmigaOS, several system structures must be allocated
+ * and freed using system functions. "struct AnchorPath" is one.
+ */
+#ifdef __amigaos4__
+# include <dos/anchorpath.h>
+# define	free_fib(x) FreeDosObject(DOS_FIB, x)
+#else
+# define	free_fib(x) vim_free(fib)
+#endif
+
 #if defined(LATTICE) && !defined(SASC) && defined(FEAT_ARP)
 # include <libraries/arp_pragmas.h>
 #endif
@@ -56,7 +67,9 @@
 #undef	FALSE
 #define FALSE (0)
 
-#if !defined(AZTEC_C) && !defined(__AROS__)
+#ifdef __amigaos4__
+# define	dos_packet(a, b, c)   DoPkt(a, b, c, 0, 0, 0, 0)
+#elif !defined(AZTEC_C) && !defined(__AROS__)
 static long dos_packet __ARGS((struct MsgPort *, long, long));
 #endif
 static int lock2name __ARGS((BPTR lock, char_u *buf, long   len));
@@ -68,7 +81,9 @@ static BPTR		raw_in = (BPTR)NULL;
 static BPTR		raw_out = (BPTR)NULL;
 static int		close_win = FALSE;  /* set if Vim opened the window */
 
+#ifndef __amigaos4__	/* Use autoopen for AmigaOS4 */
 struct IntuitionBase	*IntuitionBase = NULL;
+#endif
 #ifdef FEAT_ARP
 struct ArpBase		*ArpBase = NULL;
 #endif
@@ -186,9 +201,17 @@ mch_char_avail()
 mch_avail_mem(special)
     int	    special;
 {
+#ifdef __amigaos4__
+    return (long_u)AvailMem(MEMF_ANY);
+#else
     return (long_u)AvailMem(special ? (long)MEMF_CHIP : (long)MEMF_ANY);
+#endif
 }
 
+/*
+ * Waits a specified amount of time, or until input arrives if
+ * ignoreinput is FALSE.
+ */
     void
 mch_delay(msec, ignoreinput)
     long    msec;
@@ -252,6 +275,7 @@ mch_init()
     out_flush();
 
     wb_window = NULL;
+#ifndef __amigaos4__
     if ((IntuitionBase = (struct IntuitionBase *)
 				OpenLibrary((UBYTE *)intlibname, 0L)) == NULL)
     {
@@ -260,6 +284,7 @@ mch_init()
 	mch_errmsg("!?\n");
 	mch_exit(3);
     }
+#endif
 }
 
 #include <workbench/startup.h>
@@ -284,7 +309,7 @@ mch_check_win(argc, argv)
 {
     int		    i;
     BPTR	    nilfh, fh;
-    char_u	    buf1[20];
+    char_u	    buf1[24];
     char_u	    buf2[BUF2SIZE];
     static char_u   *(constrings[3]) = {(char_u *)"con:0/0/662/210/",
 					(char_u *)"con:0/0/640/200/",
@@ -295,35 +320,39 @@ mch_check_win(argc, argv)
     char	    *av;
     char_u	    *device = NULL;
     int		    exitval = 4;
+#ifndef __amigaos4__
     struct Library  *DosBase;
+#endif
     int		    usewin = FALSE;
 
 /*
  * check if we are running under DOS 2.0x or higher
  */
+#ifndef __amigaos4__
     DosBase = OpenLibrary(DOS_LIBRARY, 37L);
     if (DosBase != NULL)
     /* if (((struct Library *)DOSBase)->lib_Version >= 37) */
     {
 	CloseLibrary(DosBase);
-#ifdef FEAT_ARP
+# ifdef FEAT_ARP
 	dos2 = TRUE;
-#endif
+# endif
     }
     else	    /* without arp functions we NEED 2.0 */
     {
-#ifndef FEAT_ARP
+# ifndef FEAT_ARP
 	mch_errmsg(_("Need Amigados version 2.04 or later\n"));
 	exit(3);
-#else
+# else
 		    /* need arp functions for dos 1.x */
 	if (!(ArpBase = (struct ArpBase *) OpenLibrary((UBYTE *)ArpName, ArpVersion)))
 	{
 	    fprintf(stderr, _("Need %s version %ld\n"), ArpName, ArpVersion);
 	    exit(3);
 	}
-#endif
+# endif
     }
+#endif	/* __amigaos4__ */
 
     /*
      * scan argv[] for the "-f" and "-d" arguments
@@ -398,8 +427,15 @@ mch_check_win(argc, argv)
     /*
      * Make a unique name for the temp file (which we will not delete!).
      * Use a pointer on the stack (nobody else will be using it).
+     * Under AmigaOS4, this assumption might change in the future, so
+     * we use a pointer to the current task instead. This should be a
+     * shared structure and thus globally unique.
      */
+#ifdef __amigaos4__
+    sprintf((char *)buf1, "t:nc%p", FindTask(0));
+#else
     sprintf((char *)buf1, "t:nc%ld", (long)buf1);
+#endif
     if ((fh = Open((UBYTE *)buf1, (long)MODE_NEWFILE)) == (BPTR)NULL)
     {
 	mch_errmsg(_("Cannot create "));
@@ -513,7 +549,8 @@ mch_input_isatty()
 
 /*
  * fname_case(): Set the case of the file name, if it already exists.
- *		 This will cause the file name to remain exactly the same.
+ *		 This will cause the file name to remain exactly the same
+ *		 if the file system ignores, but preserves case.
  */
 /*ARGSUSED*/
     void
@@ -528,9 +565,14 @@ fname_case(name, len)
     if (fib != NULL)
     {
 	flen = STRLEN(name);
+	/* TODO: Check if this fix applies to AmigaOS < 4 too.*/
+#ifdef __amigaos4__
+	if (fib->fib_DirEntryType == ST_ROOT)
+	    strcat(fib->fib_FileName, ":");
+#endif
 	if (flen == strlen(fib->fib_FileName))	/* safety check */
 	    mch_memmove(name, fib->fib_FileName, flen);
-	vim_free(fib);
+	free_fib(fib);
     }
 }
 
@@ -548,13 +590,17 @@ get_fib(fname)
 
     if (fname == NULL)	    /* safety check */
 	return NULL;
-    fib = (struct FileInfoBlock *)malloc(sizeof(struct FileInfoBlock));
+#ifdef __amigaos4__
+    fib = AllocDosObject(DOS_FIB,0);
+#else
+    fib = (struct FileInfoBlock *)alloc(sizeof(struct FileInfoBlock));
+#endif
     if (fib != NULL)
     {
 	flock = Lock((UBYTE *)fname, (long)ACCESS_READ);
 	if (flock == (BPTR)NULL || !Examine(flock, fib))
 	{
-	    vim_free(fib);  /* in case of an error the memory is freed here */
+	    free_fib(fib);  /* in case of an error the memory is freed here */
 	    fib = NULL;
 	}
 	if (flock)
@@ -613,6 +659,7 @@ mch_get_user_name(s, len)
     char_u  *s;
     int	    len;
 {
+    /* TODO: Implement this. */
     *s = NUL;
     return FAIL;
 }
@@ -625,7 +672,11 @@ mch_get_host_name(s, len)
     char_u  *s;
     int	    len;
 {
+#if defined(__amigaos4__) && defined(__CLIB2__)
+    gethostname(s, len);
+#else
     vim_strncpy(s, "Amiga", len - 1);
+#endif
 }
 
 /*
@@ -634,7 +685,14 @@ mch_get_host_name(s, len)
     long
 mch_get_pid()
 {
+#ifdef __amigaos4__
+    /* This is as close to a pid as we can come. We could use CLI numbers also,
+     * but then we would have two different types of process identifiers.
+     */
+    return((long)FindTask(0));
+#else
     return (long)0;
+#endif
 }
 
 /*
@@ -746,7 +804,7 @@ mch_getperm(name)
     if (fib != NULL)
     {
 	retval = fib->fib_Protection;
-	vim_free(fib);
+	free_fib(fib);
     }
     return retval;
 }
@@ -790,8 +848,12 @@ mch_isdir(name)
     fib = get_fib(name);
     if (fib != NULL)
     {
+#ifdef __amigaos4__
+	retval = (FIB_IS_DRAWER(fib)) ? TRUE : FALSE;
+#else
 	retval = ((fib->fib_DirEntryType >= 0) ? TRUE : FALSE);
-	vim_free(fib);
+#endif
+	free_fib(fib);
     }
     return retval;
 }
@@ -912,7 +974,7 @@ mch_exit(r)
 mch_settmode(tmode)
     int		tmode;
 {
-#ifdef __AROS__
+#if defined(__AROS__) || defined(__amigaos4__)
     if (!SetMode(raw_in, tmode == TMODE_RAW ? 1 : 0))
 #else
     if (dos_packet(MP(raw_in), (long)ACTION_SCREEN_MODE,
@@ -954,14 +1016,21 @@ mch_screenmode(arg)
 mch_get_shellsize()
 {
     struct ConUnit  *conUnit;
+#ifndef __amigaos4__
     char	    id_a[sizeof(struct InfoData) + 3];
-    struct InfoData *id;
+#endif
+    struct InfoData *id=0;
 
     if (!term_console)	/* not an amiga window */
-	return FAIL;
+	goto out;
 
     /* insure longword alignment */
+#ifdef __amigaos4__
+    if(!(id = AllocDosObject(DOS_INFODATA, 0)))
+	goto out;
+#else
     id = (struct InfoData *)(((long)id_a + 3L) & ~3L);
+#endif
 
     /*
      * Should make console aware of real window size, not the one we set.
@@ -983,7 +1052,7 @@ mch_get_shellsize()
 	/* it's not an amiga window, maybe aux device */
 	/* terminal type should be set */
 	term_console = FALSE;
-	return FAIL;
+	goto out;
     }
     if (oldwindowtitle == NULL)
 	oldwindowtitle = (char_u *)wb_window->Title;
@@ -1006,6 +1075,12 @@ mch_get_shellsize()
     }
 
     return OK;
+out:
+#ifdef __amigaos4__
+    FreeDosObject(DOS_INFODATA, id); /* Safe to pass NULL */
+#endif
+
+    return FAIL;
 }
 
 /*
@@ -1046,7 +1121,7 @@ out_num(n)
     OUT_STR_NF(tltoa((unsigned long)n));
 }
 
-#if !defined(AZTEC_C) && !defined(__AROS__)
+#if !defined(AZTEC_C) && !defined(__AROS__) && !defined(__amigaos4__)
 /*
  * Sendpacket.c
  *
@@ -1371,8 +1446,12 @@ Chk_Abort(void)
  *	Use and abuse as you please.
  */
 
-#define ANCHOR_BUF_SIZE (512)
-#define ANCHOR_SIZE (sizeof(struct AnchorPath) + ANCHOR_BUF_SIZE)
+#ifdef __amigaos4__
+# define	ANCHOR_BUF_SIZE	1024
+#else
+# define ANCHOR_BUF_SIZE (512)
+# define ANCHOR_SIZE (sizeof(struct AnchorPath) + ANCHOR_BUF_SIZE)
+#endif
 
     int
 mch_expandpath(gap, pat, flags)
@@ -1385,19 +1464,32 @@ mch_expandpath(gap, pat, flags)
     char_u		*starbuf, *sp, *dp;
     int			start_len;
     int			matches;
+#ifdef __amigaos4__
+    struct TagItem	AnchorTags[] = {
+	{ADO_Strlen, ANCHOR_BUF_SIZE},
+	{ADO_Flags, APF_DODOT|APF_DOWILD|APF_MultiAssigns},
+	{TAG_DONE, 0L}
+    };
+#endif
 
     start_len = gap->ga_len;
 
     /* Get our AnchorBase */
+#ifdef __amigaos4__
+    Anchor = AllocDosObject(DOS_ANCHORPATH, AnchorTags);
+#else
     Anchor = (struct AnchorPath *)alloc_clear((unsigned)ANCHOR_SIZE);
+#endif
     if (Anchor == NULL)
 	return 0;
 
+#ifndef __amigaos4__
     Anchor->ap_Strlen = ANCHOR_BUF_SIZE;  /* ap_Length not supported anymore */
-#ifdef APF_DODOT
+# ifdef APF_DODOT
     Anchor->ap_Flags = APF_DODOT | APF_DOWILD;	/* allow '.' for current dir */
-#else
+# else
     Anchor->ap_Flags = APF_DoDot | APF_DoWild;	/* allow '.' for current dir */
+# endif
 #endif
 
 #ifdef FEAT_ARP
@@ -1432,7 +1524,11 @@ mch_expandpath(gap, pat, flags)
      */
     while (Result == 0)
     {
+#ifdef __amigaos4__
+	addfile(gap, (char_u *)Anchor->ap_Buffer, flags);
+#else
 	addfile(gap, (char_u *)Anchor->ap_Buf, flags);
+#endif
 #ifdef FEAT_ARP
 	if (dos2)
 #endif
@@ -1469,7 +1565,11 @@ mch_expandpath(gap, pat, flags)
 #endif
 
 Return:
+#ifdef __amigaos4__
+    FreeDosObject(DOS_ANCHORPATH, Anchor);
+#else
     vim_free(Anchor);
+#endif
 
     return matches;
 }
--- a/src/os_amiga.h
+++ b/src/os_amiga.h
@@ -17,9 +17,12 @@
 #define HAVE_AVAIL_MEM
 
 #ifndef HAVE_CONFIG_H
-# ifdef AZTEC_C
+# if defined(AZTEC_C) || defined(__amigaos4__)
 #  define HAVE_STAT_H
 # endif
+# ifdef __amigaos4__
+#  define HAVE_STDARG_H
+# endif
 # define HAVE_STDLIB_H
 # define HAVE_STRING_H
 # define HAVE_FCNTL_H
@@ -34,15 +37,24 @@
 #  define HAVE_DATE_TIME
 # endif
 
-#define DFLT_ERRORFILE		"AztecC.Err"
-#define DFLT_RUNTIMEPATH "home:vimfiles,$VIM/vimfiles,$VIMRUNTIME,$VIM/vimfiles/after,home:vimfiles/after"
+#endif /* HAVE_CONFIG_H */
 
-#define BASENAMELEN	26	/* Amiga */
+#ifndef	DFLT_ERRORFILE
+# define DFLT_ERRORFILE		"AztecC.Err"	/* Should this change? */
+#endif
 
-#define TEMPNAME	"t:v?XXXXXX"
-#define TEMPNAMELEN	12
+#ifndef	DFLT_RUNTIMEPATH
+# define DFLT_RUNTIMEPATH "home:vimfiles,$VIM/vimfiles,$VIMRUNTIME,$VIM/vimfiles/after,home:vimfiles/after"
+#endif
 
-#endif /* HAVE_CONFIG_H */
+#ifndef	BASENAMELEN
+# define BASENAMELEN	26	/* Amiga */
+#endif
+
+#ifndef	TEMPNAME
+# define TEMPNAME	"t:v?XXXXXX"
+# define TEMPNAMELEN	12
+#endif
 
 #include <exec/types.h>
 #include <libraries/dos.h>
@@ -155,9 +167,9 @@ typedef long off_t;
 #endif
 
 #ifdef FEAT_VIMINFO
-#ifndef VIMINFO_FILE
-# define VIMINFO_FILE	"s:.viminfo"
-#endif
+# ifndef VIMINFO_FILE
+#  define VIMINFO_FILE	"s:.viminfo"
+# endif
 #endif /* FEAT_VIMINFO */
 
 #ifndef EXRC_FILE
--- a/src/pty.c
+++ b/src/pty.c
@@ -51,7 +51,7 @@
 # include <sys/termios.h>
 #endif
 
-#if HAVE_SYS_IOCTL_H
+#ifdef HAVE_SYS_IOCTL_H
 # include <sys/ioctl.h>
 #endif
 
@@ -69,14 +69,14 @@
 # endif
 #endif
 
-#if HAVE_UNISTD_H
+#ifdef HAVE_UNISTD_H
 # include <unistd.h>
 #endif
 
 #if HAVE_TERMIO_H
 # include <termio.h>
 #else
-# if HAVE_TERMIOS_H
+# ifdef HAVE_TERMIOS_H
 #  include <termios.h>
 # endif
 #endif
--- a/src/version.c
+++ b/src/version.c
@@ -667,6 +667,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    156,
+/**/
     155,
 /**/
     154,