This is the mail archive of the cygwin@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: running mks toolkit and cygwin on same machine


scowles@earthlink.net wrote:

TB> Though Cygwin seems to have left MKS in the dust for most
TB> of the functions I am interested in -- vim vs. vi, mutt
TB> vs. mailx, fetchmail vs. something-that-didn't-work-for-me,
TB> procmail vs. nothing -- there are a few commands that I still
TB> use in their MKS versions:

TB>     cpio      - is this out of fashion now, or what?

yes, it is.  the big difference between cpio and tar in ages past was
that cpio could handle devices.  (arguably, complete lists in
configuration management are handled much easier by cpio's stdin
filename input method).  however, gnutar now handles devices just as well.
in addition, gnutar handles major compression techniques internally.
source for gnu cpio (i have used ver. 2.4.2 for years) is readily
available and compiles ootb on cygwin.  it handles all of my ancient
archives from multiple platforms.

Yeah, but cpio is still valuable for mucking with rpm's. I often do this, when I want to extract code without installing the rpm...

rpm2cpio foo.rpm | cpio -i --make-directories

Granted, we don't have rpm yet, so...


TB>     flip      - changes CRLF endings; no equivalent in Cygwin?

easy to do in any shell:  invoke /bin/tr to do the translation
you need.  e.g.  for cr to lf:  cat $file | /bin/tr '\015' '\

d2u and u2d are already in the cygutils package.


TB>     more      - sometimes I do not want the text to disappear from
TB>                 the screen on exit

/bin/more is part of cygwin on my system (current as of 2 hours ago,
full install).

Yep.  But don't use it -- less is much better.

TB>     rev       - reverse order of characters in a line


This is on my TODO list for cygutils. On linux, it is part of the util-linux package, a grab bag of random small utilities. On cygwin, cygutils is the grab bag of random small utilities: hence...

I've attached the util-linux source for rev.c -- it's a bit more complex (complete?) than some of the other implementations...I'll probably use it as the basis for cygutils' version.

--Chuck

/*-
 * Copyright (c) 1987, 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. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *	This product includes software developed by the University of
 *	California, Berkeley and its contributors.
 * 4. 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.
 *
 * Modified for Linux by Charles Hannum (mycroft@gnu.ai.mit.edu)
 *                   and Brian Koehmstedt (bpk@gnu.ai.mit.edu)
 *
 * Wed Sep 14 22:26:00 1994: Patch from bjdouma <bjdouma@xs4all.nl> to handle
 *                           last line that has no newline correctly.
 * 3-Jun-1998: Patched by Nicolai Langfeldt to work better on Linux:
 * 	Handle any-length-lines.  Code copied from util-linux' setpwnam.c
 * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@pld.ORG.PL>
 * 	added Native Language Support
 * 1999-09-19 Bruno Haible <haible@clisp.cons.org>
 * 	modified to work correctly in multi-byte locales
 *
 */

#include <stdarg.h>
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "nls.h"

#include "widechar.h"

void usage(void);
void warn(const char *, ...);

int
main(int argc, char *argv[])
{
  register char *filename;
  register wchar_t *t;
  size_t buflen = 512;
  wchar_t *p = malloc(buflen*sizeof(wchar_t));
  size_t len;
  FILE *fp;
  int ch, rval;

  setlocale(LC_ALL, "");
  bindtextdomain(PACKAGE, LOCALEDIR);
  textdomain(PACKAGE);

  while ((ch = getopt(argc, argv, "")) != EOF)
    switch(ch) {
    case '?':
    default:
      usage();
    }

  argc -= optind;
  argv += optind;

  fp = stdin;
  filename = "stdin";
  rval = 0;
  do {
    if (*argv) {
      if ((fp = fopen(*argv, "r")) == NULL) {
	warn("%s: %s", *argv, strerror(errno));
	rval = 1;
	++argv;
	continue;
      }
      filename = *argv++;
    }

    while (fgetws(p, buflen, fp)) {

      len = wcslen(p);

      /* This is my hack from setpwnam.c -janl */
      while (p[len-1] != '\n' && !feof(fp)) {
	/* Extend input buffer if it failed getting the whole line */

	/* So now we double the buffer size */
	buflen *= 2;

	p = realloc(p, buflen*sizeof(wchar_t));
	if (p == NULL) {
	  fprintf(stderr,_("Unable to allocate bufferspace\n"));
	  exit(1);
	}

	/* And fill the rest of the buffer */
	if (fgetws(&p[len], buflen/2, fp) == NULL) break;

	len = wcslen(p);
      
	/* That was a lot of work for nothing.  Gimme perl! */
      }
		  
      t = p + len - 1 - (*(p+len-1)=='\r' || *(p+len-1)=='\n');
      for ( ; t >= p; --t)
	if (*t != 0)
	  putwchar(*t);
      putwchar('\n');
    }
    fflush(fp);
    if (ferror(fp)) {
      warn("%s: %s", filename, strerror(errno));
      rval = 1;
    }
    if (fclose(fp))
      rval = 1;
  } while(*argv);
  exit(rval);
}

void
warn(const char *fmt, ...)
{
	va_list ap;
	va_start(ap, fmt);
	(void)fprintf(stderr, "rev: ");
	(void)vfprintf(stderr, fmt, ap);
	va_end(ap);
	(void)fprintf(stderr, "\n");
}

void
usage(void)
{
	(void)fprintf(stderr, _("usage: rev [file ...]\n"));
	exit(1);
}

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Bug reporting:         http://cygwin.com/bugs.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]