* [HACK] making dash works in MSYS environment
@ 2012-09-05 8:06 Roy Tam
2012-09-06 0:05 ` [HACK v2] " Roy Tam
0 siblings, 1 reply; 2+ messages in thread
From: Roy Tam @ 2012-09-05 8:06 UTC (permalink / raw)
To: dash
Dear all,
There is a hack for making dash working in MSYS environment.
briefly in points:
- there is no fnmatch.h in MSYS
- ungetc()ing 0x0D is need in MSYS as some MinGW utilities (for
example GCC) will return in CRLF line ending
- strtoll()/strtoull() is missing in MSYS, inlining
http://cygwin.com/ml/cygwin-apps/2011-07/txt00006.txt to mystring.c as
a big hack
Regards,
Roy
diff --git a/src/expand.c b/src/expand.c
index ce60fe9..01662e7 100644
--- a/src/expand.c
+++ b/src/expand.c
@@ -45,7 +45,7 @@
#include <inttypes.h>
#include <limits.h>
#include <string.h>
-#include <fnmatch.h>
+//#include <fnmatch.h>
#ifdef HAVE_GLOB
#include <glob.h>
#endif
@@ -557,7 +557,7 @@ read:
/* Eat all trailing newlines */
dest = expdest;
- for (; dest > (char *)stackblock() && dest[-1] == '\n';)
+ for (; dest > (char *)stackblock() && (dest[-1] == '\n'||dest[-1] == '\r');)
STUNPUTC(dest);
expdest = dest;
diff --git a/src/mystring.c b/src/mystring.c
index 0106bd2..7b70baa 100644
--- a/src/mystring.c
+++ b/src/mystring.c
@@ -56,6 +56,140 @@
#include "parser.h"
#include "system.h"
+// msys hack
+#ifdef __MSYS__
+/* implementation adapted from google android bionic libc's
+ * strntoumax and strntoimax (removing the dependency on 'n')
+ */
+
+/*-
+ * Copyright (c) 1992 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:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. 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.
+ */
+
+#include <sys/types.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+
+static inline int digitval(int ch)
+{
+ unsigned d;
+
+ d = (unsigned)(ch - '0');
+ if (d < 10) return (int)d;
+
+ d = (unsigned)(ch - 'a');
+ if (d < 6) return (int)(d+10);
+
+ d = (unsigned)(ch - 'A');
+ if (d < 6) return (int)(d+10);
+
+ return -1;
+}
+
+/*
+ * Convert a string to an unsigned long long.
+ *
+ * Ignores `locale' stuff. Assumes that the upper and lower case
+ * alphabets and digits are each contiguous.
+ */
+unsigned long long
+strtoull(const char *nptr, char **endptr, int base)
+{
+ const unsigned char* p = nptr;
+ const unsigned char* end;
+ int minus = 0;
+ unsigned long long v = 0;
+ int d;
+ end = p + strlen(nptr);
+
+ /* skip leading space */
+ while (p < end && isspace(*p))
+ p++;
+
+ /* Single optional + or - */
+ if (p < end)
+ {
+ char c = p[0];
+ if ( c == '-' || c == '+' )
+ {
+ minus = (c == '-');
+ p++;
+ }
+ }
+
+ if ( base == 0 )
+ {
+ if ( p+2 < end && p[0] == '0' && (p[1] == 'x' || p[1] == 'X') )
+ {
+ p += 2;
+ base = 16;
+ }
+ else if ( p+1 < end && p[0] == '0' )
+ {
+ p += 1;
+ base = 8;
+ }
+ else
+ {
+ base = 10;
+ }
+ }
+ else if ( base == 16 )
+ {
+ if ( p+2 < end && p[0] == '0' && (p[1] == 'x' || p[1] == 'X') )
+ {
+ p += 2;
+ }
+ }
+
+ while ( p < end && (d = digitval(*p)) >= 0 && d < base )
+ {
+ v = v*base + d;
+ p += 1;
+ }
+
+ if ( endptr )
+ *endptr = (char *)p;
+
+ return minus ? -v : v;
+}
+
+long long
+strtoll(const char *nptr, char **endptr, int base)
+{
+ return (long long) strtoull(nptr, endptr, base);
+}
+#endif
+// msys hack
char nullstr[1]; /* zero length string */
const char spcstr[] = " ";
diff --git a/src/show.c b/src/show.c
index 4a049e9..f313c39 100644
--- a/src/show.c
+++ b/src/show.c
@@ -398,7 +398,7 @@ opentrace(void)
if ((flags = fcntl(fileno(tracefile), F_GETFL, 0)) >= 0)
fcntl(fileno(tracefile), F_SETFL, flags | O_APPEND);
#endif
-#ifndef __KLIBC__
+#if !defined(__KLIBC__) && !defined(__MSYS__)
setlinebuf(tracefile);
#endif /* __KLIBC__ */
fputs("\nTracing started.\n", tracefile);
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [HACK v2] making dash works in MSYS environment
2012-09-05 8:06 [HACK] making dash works in MSYS environment Roy Tam
@ 2012-09-06 0:05 ` Roy Tam
0 siblings, 0 replies; 2+ messages in thread
From: Roy Tam @ 2012-09-06 0:05 UTC (permalink / raw)
To: dash
2012/9/5 Roy Tam <roytam@gmail.com>:
> Dear all,
>
> There is a hack for making dash working in MSYS environment.
> briefly in points:
> - there is no fnmatch.h in MSYS
> - ungetc()ing 0x0D is need in MSYS as some MinGW utilities (for
> example GCC) will return in CRLF line ending
> - strtoll()/strtoull() is missing in MSYS, inlining
> http://cygwin.com/ml/cygwin-apps/2011-07/txt00006.txt to mystring.c as
> a big hack
>
> Regards,
> Roy
>
This patch really processes CRLF only, standalone CR can be kept.
diff --git a/src/expand.c b/src/expand.c
index ce60fe9..c758414 100644
--- a/src/expand.c
+++ b/src/expand.c
@@ -45,7 +45,7 @@
#include <inttypes.h>
#include <limits.h>
#include <string.h>
-#include <fnmatch.h>
+//#include <fnmatch.h>
#ifdef HAVE_GLOB
#include <glob.h>
#endif
@@ -516,6 +516,7 @@ expbackq(union node *cmd, int flag)
{
struct backcmd in;
int i;
+ int pc = 0;
char buf[128];
char *p;
char *dest;
@@ -557,8 +558,8 @@ read:
/* Eat all trailing newlines */
dest = expdest;
- for (; dest > (char *)stackblock() && dest[-1] == '\n';)
- STUNPUTC(dest);
+ for (; dest > (char *)stackblock() && (dest[-1] == '\n'||(dest[-1]
== '\r' && pc == '\n'));)
+ pc = dest[-1], STUNPUTC(dest);
expdest = dest;
if (!(flag & EXP_QUOTED))
diff --git a/src/mystring.c b/src/mystring.c
index 0106bd2..7b70baa 100644
--- a/src/mystring.c
+++ b/src/mystring.c
@@ -56,6 +56,140 @@
#include "parser.h"
#include "system.h"
+// msys hack
+#ifdef __MSYS__
+/* implementation adapted from google android bionic libc's
+ * strntoumax and strntoimax (removing the dependency on 'n')
+ */
+
+/*-
+ * Copyright (c) 1992 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:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. 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.
+ */
+
+#include <sys/types.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+
+static inline int digitval(int ch)
+{
+ unsigned d;
+
+ d = (unsigned)(ch - '0');
+ if (d < 10) return (int)d;
+
+ d = (unsigned)(ch - 'a');
+ if (d < 6) return (int)(d+10);
+
+ d = (unsigned)(ch - 'A');
+ if (d < 6) return (int)(d+10);
+
+ return -1;
+}
+
+/*
+ * Convert a string to an unsigned long long.
+ *
+ * Ignores `locale' stuff. Assumes that the upper and lower case
+ * alphabets and digits are each contiguous.
+ */
+unsigned long long
+strtoull(const char *nptr, char **endptr, int base)
+{
+ const unsigned char* p = nptr;
+ const unsigned char* end;
+ int minus = 0;
+ unsigned long long v = 0;
+ int d;
+ end = p + strlen(nptr);
+
+ /* skip leading space */
+ while (p < end && isspace(*p))
+ p++;
+
+ /* Single optional + or - */
+ if (p < end)
+ {
+ char c = p[0];
+ if ( c == '-' || c == '+' )
+ {
+ minus = (c == '-');
+ p++;
+ }
+ }
+
+ if ( base == 0 )
+ {
+ if ( p+2 < end && p[0] == '0' && (p[1] == 'x' || p[1] == 'X') )
+ {
+ p += 2;
+ base = 16;
+ }
+ else if ( p+1 < end && p[0] == '0' )
+ {
+ p += 1;
+ base = 8;
+ }
+ else
+ {
+ base = 10;
+ }
+ }
+ else if ( base == 16 )
+ {
+ if ( p+2 < end && p[0] == '0' && (p[1] == 'x' || p[1] == 'X') )
+ {
+ p += 2;
+ }
+ }
+
+ while ( p < end && (d = digitval(*p)) >= 0 && d < base )
+ {
+ v = v*base + d;
+ p += 1;
+ }
+
+ if ( endptr )
+ *endptr = (char *)p;
+
+ return minus ? -v : v;
+}
+
+long long
+strtoll(const char *nptr, char **endptr, int base)
+{
+ return (long long) strtoull(nptr, endptr, base);
+}
+#endif
+// msys hack
char nullstr[1]; /* zero length string */
const char spcstr[] = " ";
diff --git a/src/show.c b/src/show.c
index 4a049e9..f313c39 100644
--- a/src/show.c
+++ b/src/show.c
@@ -398,7 +398,7 @@ opentrace(void)
if ((flags = fcntl(fileno(tracefile), F_GETFL, 0)) >= 0)
fcntl(fileno(tracefile), F_SETFL, flags | O_APPEND);
#endif
-#ifndef __KLIBC__
+#if !defined(__KLIBC__) && !defined(__MSYS__)
setlinebuf(tracefile);
#endif /* __KLIBC__ */
fputs("\nTracing started.\n", tracefile);
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2012-09-06 0:05 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-09-05 8:06 [HACK] making dash works in MSYS environment Roy Tam
2012-09-06 0:05 ` [HACK v2] " Roy Tam
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).