Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

Theo de Raadt

Name: Anonymous 2011-01-06 11:59


/*    $OpenBSD: echo.c,v 1.7 2009/10/27 23:59:21 deraadt Exp $    */
/*    $NetBSD: echo.c,v 1.6 1995/03/21 09:04:27 cgd Exp $    */

/*
 * Copyright (c) 1989, 1993
 *    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 <stdio.h>
#include <stdlib.h>
#include <string.h>

/* ARGSUSED */
int
main( /* it's fucking unused, theo*/ int argc, char *argv[])
{
    int nflag; /* it's a fucking boolean, theo*/

    /* This utility may NOT do getopt(3) option parsing. */
    if (*++argv /*it's not a fucking boolean, theo*/ && !strcmp(*argv, "-n") /*it's not a fucking boolean, theo*/ ) {
        ++argv;
        nflag = 1; /*it's a fucking boolean, theo*/
    }
    else
        nflag = 0; /*it's a fucking boolean, theo*/

    while (*argv /*it's not a fucking boolean, theo*/ ) {
        (void)fputs(*argv, stdout);
        if (*++argv /*it's not a fucking boolean, theo*/)
            putchar(' '); /*unused return result, theo*/
    }
    if (!nflag)
        putchar('\n'); /*unused return result, theo*/

    return 0; /* not a exit status macro, theo*/
}



Our efforts emphasize _portability_, _standardization_, _correctness_, proactive security and integrated cryptography.

Name: Anonymous 2011-01-06 12:03

There is no boolean type in C. All integer and pointer types can be evaluated in boolean operations. A null pointer is false, a non-null pointer is true. strcmp returns 0 when strings are equal, and !0 is equal to 1 which is true.

The more you know.

Name: Anonymous 2011-01-06 12:08

>>1
You're not man enough to code C like that.

Name: Anonymous 2011-01-06 12:18

what spastic wrote these comments

Name: Anonymous 2011-01-06 12:22

>>4
OP did, while have a few cocks in his mouth.

Name: Anonymous 2011-01-06 12:56

>>1
0/10

Name: Anonymous 2011-01-06 13:36

>>1
What's with that toy code?
Here's a real implementation of echo.

/* echo.c, derived from code echo.c in Bash.
   Copyright (C) 1987, 1989, 1991-1997, 1999-2005, 2007-2010 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 3 of the License, 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, see <http://www.gnu.org/licenses/>;.  */

#include <config.h>
#include <stdio.h>
#include <sys/types.h>
#include "system.h"

/* The official name of this program (e.g., no `g' prefix).  */
#define PROGRAM_NAME "echo"

#define AUTHORS \
  proper_name ("Brian Fox"), \
  proper_name ("Chet Ramey")

/* If true, interpret backslash escapes by default.  */
#ifndef DEFAULT_ECHO_TO_XPG
enum { DEFAULT_ECHO_TO_XPG = false };
#endif

void
usage (int status)
{
  if (status != EXIT_SUCCESS)
    fprintf (stderr, _("Try `%s --help' for more information.\n"),
             program_name);
  else
    {
      printf (_("\
Usage: %s [SHORT-OPTION]... [STRING]...\n\
  or:  %s LONG-OPTION\n\
"), program_name, program_name);
      fputs (_("\
Echo the STRING(s) to standard output.\n\
\n\
  -n             do not output the trailing newline\n\
"), stdout);
      fputs (_(DEFAULT_ECHO_TO_XPG
               ? N_("\
  -e             enable interpretation of backslash escapes (default)\n\
  -E             disable interpretation of backslash escapes\n")
               : N_("\
  -e             enable interpretation of backslash escapes\n\
  -E             disable interpretation of backslash escapes (default)\n")),
             stdout);
      fputs (HELP_OPTION_DESCRIPTION, stdout);
      fputs (VERSION_OPTION_DESCRIPTION, stdout);
      fputs (_("\
\n\
If -e is in effect, the following sequences are recognized:\n\
\n\
"), stdout);
      fputs (_("\
  \\\\      backslash\n\
  \\a      alert (BEL)\n\
  \\b      backspace\n\
  \\c      produce no further output\n\
  \\e      escape\n\
  \\f      form feed\n\
  \\n      new line\n\
  \\r      carriage return\n\
  \\t      horizontal tab\n\
  \\v      vertical tab\n\
"), stdout);
      fputs (_("\
  \\0NNN   byte with octal value NNN (1 to 3 digits)\n\
  \\xHH    byte with hexadecimal value HH (1 to 2 digits)\n\
"), stdout);
      printf (USAGE_BUILTIN_WARNING, PROGRAM_NAME);
      emit_ancillary_info ();
    }
  exit (status);
}

/* Convert C from hexadecimal character to integer.  */
static int
hextobin (unsigned char c)
{
  switch (c)
    {
    default: return c - '0';
    case 'a': case 'A': return 10;
    case 'b': case 'B': return 11;
    case 'c': case 'C': return 12;
    case 'd': case 'D': return 13;
    case 'e': case 'E': return 14;
    case 'f': case 'F': return 15;
    }
}

/* Print the words in LIST to standard output.  If the first word is
   `-n', then don't print a trailing newline.  We also support the
   echo syntax from Version 9 unix systems. */

int
main (int argc, char **argv)
{
  bool display_return = true;
  bool allow_options =
    (! getenv ("POSIXLY_CORRECT")
     || (! DEFAULT_ECHO_TO_XPG && 1 < argc && STREQ (argv[1], "-n")));

  /* System V machines already have a /bin/sh with a v9 behavior.
     Use the identical behavior for these machines so that the
     existing system shell scripts won't barf.  */
  bool do_v9 = DEFAULT_ECHO_TO_XPG;

  initialize_main (&argc, &argv);
  set_program_name (argv[0]);
  setlocale (LC_ALL, "");
  bindtextdomain (PACKAGE, LOCALEDIR);
  textdomain (PACKAGE);

  atexit (close_stdout);

  /* We directly parse options, rather than use parse_long_options, in
     order to avoid accepting abbreviations.  */
  if (allow_options && argc == 2)
    {
      if (STREQ (argv[1], "--help"))
        usage (EXIT_SUCCESS);

      if (STREQ (argv[1], "--version"))
        {
          version_etc (stdout, PROGRAM_NAME, PACKAGE_NAME, Version, AUTHORS,
                       (char *) NULL);
          exit (EXIT_SUCCESS);
        }
    }

  --argc;
  ++argv;

  if (allow_options)
    while (argc > 0 && *argv[0] == '-')
      {
        char const *temp = argv[0] + 1;
        size_t i;

        /* If it appears that we are handling options, then make sure that
           all of the options specified are actually valid.  Otherwise, the
           string should just be echoed.  */

        for (i = 0; temp[i]; i++)
          switch (temp[i])
            {
            case 'e': case 'E': case 'n':
              break;
            default:
              goto just_echo;
            }

        if (i == 0)
          goto just_echo;

        /* All of the options in TEMP are valid options to ECHO.
           Handle them. */
        while (*temp)
          switch (*temp++)
            {
            case 'e':
              do_v9 = true;
              break;

            case 'E':
              do_v9 = false;
              break;

            case 'n':
              display_return = false;
              break;
            }

        argc--;
        argv++;
      }

just_echo:

  if (do_v9)
    {
      while (argc > 0)
        {
          char const *s = argv[0];
          unsigned char c;

          while ((c = *s++))
            {
              if (c == '\\' && *s)
                {
                  switch (c = *s++)
                    {
                    case 'a': c = '\a'; break;
                    case 'b': c = '\b'; break;
                    case 'c': exit (EXIT_SUCCESS);
                    case 'e': c = '\x1B'; break;
                    case 'f': c = '\f'; break;
                    case 'n': c = '\n'; break;
                    case 'r': c = '\r'; break;
                    case 't': c = '\t'; break;
                    case 'v': c = '\v'; break;
                    case 'x':
                      {
                        unsigned char ch = *s;
                        if (! isxdigit (ch))
                          goto not_an_escape;
                        s++;
                        c = hextobin (ch);
                        ch = *s;
                        if (isxdigit (ch))
                          {
                            s++;
                            c = c * 16 + hextobin (ch);
                          }
                      }
                      break;
                    case '0':
                      c = 0;
                      if (! ('0' <= *s && *s <= '7'))
                        break;
                      c = *s++;
                      /* Fall through.  */
                    case '1': case '2': case '3':
                    case '4': case '5': case '6': case '7':
                      c -= '0';
                      if ('0' <= *s && *s <= '7')
                        c = c * 8 + (*s++ - '0');
                      if ('0' <= *s && *s <= '7')
                        c = c * 8 + (*s++ - '0');
                      break;
                    case '\\': break;

                    not_an_escape:
                    default:  putchar ('\\'); break;
                    }
                }
              putchar (c);
            }
          argc--;
          argv++;
          if (argc > 0)
            putchar (' ');
        }
    }
  else
    {
      while (argc > 0)
        {
          fputs (argv[0], stdout);
          argc--;
          argv++;
          if (argc > 0)
            putchar (' ');
        }
    }

  if (display_return)
    putchar ('\n');
  exit (EXIT_SUCCESS);
}

Name: Anonymous 2011-01-06 13:51

>>7
Go away with your GNU/Rubbish. Nobody likes you. Nobody will ever love you. You will die alone.

Name: Anonymous 2011-01-06 14:19

Congratulations on not understanding C, OP.

Name: Anonymous 2011-01-06 14:49

/* echo.c, derived from code echo.c in Bash.
   Copyright (C) 1987, 1989, 1991-1997, 1999-2005, 2007-2010 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 3 of the License, 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, see <" target="_blank">http://www.gnu.org/licenses/>;;.  */

Name: Rimmis 2011-01-06 16:08

>>8
Enemy of Freedom!

Name: Anonymous 2011-01-06 16:50

>>1
You should haved posted this on openbsd-misc. They would have done a better job of notching you down than this thread has.

Name: Anonymous 2011-01-06 17:23

Anonix echo:
/* @echo.c */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char **argv) {
 int i=1, no_nl=0, ret=0;

 if(argc>1 && !strcmp(argv[1],"-n")) {
  no_nl=1;
  i++;
 }
 while(i<argc) {
  ret|=(fputs(argv[i++], stdout)==EOF);
  if(i!=argc)
   ret|=(fputc(' ',stdout)==EOF);
 }
 if(!no_nl)
  ret|=(fputc('\n',stdout)==EOF);
 return ret;
}

Name: Anonymous 2011-01-06 18:38

>>13
I OMG OPTIMISED it a little. Am I an ANONIX developer already?
/* @echo.c */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char **argv) {
 int no_nl=0, ret=0;

 if(argc>1 && !strcmp(*++argv,"-n")) {
  no_nl=1;
  ++argv;
 }
 for(;*argv;*argv && (ret|=(fputc(' ',stdout))==EOF))
  ret|=(fputs(*argv++,stdout)==EOF);
 if(!no_nl)
  ret|=(fputc('\n',stdout)==EOF);
 return ret;
}

Name: Anonymous 2011-01-06 18:40

>>14
/* @echo.c */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char **argv) {
 int no_nl=0, ret=0;

 if(argc>1 && !strcmp(*++argv,"-n"))
  no_nl=1;

 for(++argv;*argv;*argv && (ret|=(fputc(' ',stdout))==EOF))
  ret|=(fputs(*argv++,stdout)==EOF);
 if(!no_nl)
  ret|=(fputc('\n',stdout)==EOF);
 return ret;
}

Name: Anonymous 2011-01-06 18:53

>>11
s/Enemy of Freedom/Enemy of GNU/

GNU didn't fucking invent Freedom.

Name: Anonymous 2011-01-06 19:40

>>16
Don't be silly, GNU didn't invent freedom. We are merely the prophets of freedom.
[tt]                                .   .
                               /'   `\
                              //     \\
                             ( ~\\~//~ )
                              ~| @"@ |~
                               '  :  ' .
                      / \~\~\~  \ : /' ~/~/~/\
                     / \        (._.)        / \
                     /   \___-/   ;   \-___/   \
                   /      |               |      \
                  /      /    ---___---    \      \
                  (   ./      \ / __  /      \.   ?
                 /   /  (  --  .|   |.  --  ?  \   \
                 :   ,.  \      \---/      /   / ' :
                | \_/  '   (     \./     ?    \___/,
                  \    `.__ |           | __.'    /|
                |   \      : ---_____--- :      /  |
                      `-___:`---_|_|_---':___-'
                |           /\         /\          |
                           /  \       /  \
                |         /     \   /     \        |
                          |       v       |
                |         |       |       |        |
                |         |       |       |        |
                          \      / \      /        |
                |          |    |   |    |
                            \  /     \  /          |
               |            [  ]     [  ]
                 /  /      \-..-/   \-..-/     \   \
              /            |    |   |    |
                /  /    /   |  |     |  |   \     \    \
            /  ~ ~  ~  ~    :  :     :  :   ~   ~ ~ ~   \
           ~ ~              :__:     :__:              ~ ~
                           (____)   (____)

           _____                          _______   ____  __
          / ___/__  ______  ___  _____   / ____/ | / / / / /
          \__ \/ / / / __ \/ _ \/ ___/  / / __/  |/ / / / /
         ___/ / /_/ / /_/ /  __/ /     / /_/ / /|  / /_/ /
        /____/\__,_/ .___/\___/_/      \____/_/ |_/\____/
                   /_/

 ___       __             _                __   _   _           ___ ___  _
|   \ ___ / _|___ _ _  __| |___ _ _   ___ / _| | |_| |_  ___   / __| _ \| |
| |) / -_)  _/ -_) ' \/ _` / -_) '_| / _ \  _| |  _| ' \/ -_) | (_ |  _/| |__
|___/\___|_| \___|_||_\__,_\___|_|   \___/_|    \__|_||_\___|  \___|_|  |____|[/tt]

Name: Anonymous 2011-01-06 19:40

                                .   .
                               /'   `\
                              //     \\
                             ( ~\\~//~ )
                              ~| @"@ |~
                               '  :  ' .
                      / \~\~\~  \ : /' ~/~/~/\
                     / \        (._.)        / \
                     /   \___-/   ;   \-___/   \
                   /      |               |      \
                  /      /    ---___---    \      \
                  (   ./      \ / __  /      \.   ?
                 /   /  (  --  .|   |.  --  ?  \   \
                 :   ,.  \      \---/      /   / ' :
                | \_/  '   (     \./     ?    \___/,
                  \    `.__ |           | __.'    /|
                |   \      : ---_____--- :      /  |
                      `-___:`---_|_|_---':___-'
                |           /\         /\          |
                           /  \       /  \
                |         /     \   /     \        |
                          |       v       |
                |         |       |       |        |
                |         |       |       |        |
                          \      / \      /        |
                |          |    |   |    |
                            \  /     \  /          |
               |            [  ]     [  ]
                 /  /      \-..-/   \-..-/     \   \
              /            |    |   |    |
                /  /    /   |  |     |  |   \     \    \
            /  ~ ~  ~  ~    :  :     :  :   ~   ~ ~ ~   \
           ~ ~              :__:     :__:              ~ ~
                           (____)   (____)

           _____                          _______   ____  __
          / ___/__  ______  ___  _____   / ____/ | / / / / /
          \__ \/ / / / __ \/ _ \/ ___/  / / __/  |/ / / / /
         ___/ / /_/ / /_/ /  __/ /     / /_/ / /|  / /_/ /
        /____/\__,_/ .___/\___/_/      \____/_/ |_/\____/
                   /_/

 ___       __             _                __   _   _           ___ ___  _
|   \ ___ / _|___ _ _  __| |___ _ _   ___ / _| | |_| |_  ___   / __| _ \| |
| |) / -_)  _/ -_) ' \/ _` / -_) '_| / _ \  _| |  _| ' \/ -_) | (_ |  _/| |__
|___/\___|_| \___|_||_\__,_\___|_|   \___/_|    \__|_||_\___|  \___|_|  |____|

Super Failure Defender of the Fail

Name: Anonymous 2011-01-06 21:13

>>17,18

Stop that niggerdickery at once.

Name: Anonymous 2011-01-06 22:54

2 spaces for indentation?
GNU = FrozenVoid

Name: Anonymous 2011-01-07 2:46

>>20
No, it's:

if(...)
  { /* two spaces */
     ...; /* four spaces (and Perl's Yada Yada Operator) */
  } /* two spaces */
else
     ...; /* four spaces (and, again, Perl's Yada Yada Operator, so
VALID PERL CODE#) */

Name: Anonymous 2011-01-07 2:59

>>21
Perl doesn't have a Yada Yada Operator.  Perhaps you're thinking of Perl's flip-floperator?

Name: Anonymous 2011-01-07 3:06

>>22
PERL HAS EVERY OPERATOR IT WANTS, OK?
http://search.cpan.org/~jesse/perl-5.12.0/pod/perlop.pod#Yada_Yada_Operator___

HEIL TO PERL, OPERATOR OVERLORD!

Name: Anonymous 2011-01-07 4:35

At least Haskell calls it undefined, not some shamanistic guttural sounds.

Name: Anonymous 2011-01-07 5:53

>>2

There is no boolean type in C.
There is an explicit boolean type in C99. Sure, it's just a wrapper around integer but...

All integer and pointer types can be evaluated in boolean operations.
Pointer types should not be evaluated as boolean.

Brad Thomas,
CERT Security Manager

Name: Anonymous 2011-01-07 6:04

>>25
should != could

Name: Anonymous 2011-01-07 6:29

>>7 just makes me dribble with some kind of... emotion

Name: Anonymous 2011-01-07 6:33

>>25
>>26

According to the standard: pointer types can not be evaluated as boolean.

Name: Anonymous 2011-01-07 6:58


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* ARGSUSED */
int
main(int argc, char *argv[])
{
    int nflag;

    /* This utility may NOT do getopt(3) option parsing. */
    if (*++argv && !strcmp(*argv, "-n")) {
        ++argv;
        nflag = 1;
    }
    else
        nflag = 0;

    while (*argv) {
        (void)fputs(*argv, stdout);
        if (*++argv)
            (void)putchar(' ');
    }
    if (!nflag)
        (void)putchar('\n');

    return EXIT_SUCCESS;
}


That's all the changes it needs.

Name: Anonymous 2011-01-07 7:03

>>29
I find that Anoncoreutils' echo.c (>>13) is better.

Name: Anonymous 2011-01-07 7:14

Fuck you 4 space tab faggotsp

[source]#include <iostream>

int main(std::size_t count, char *arguments[])
{
  while(count-->0) std::cout << arguments[count-1];
  return std::EXIT_SUCCESS;
}[/source]

Name: Anonymous 2011-01-07 7:27

>>31
Fuck you brackets on their line faggotsp

#include<stdio.h>
#include<stdlib.h>
#define _(x,y) ((*(x))&&(y))
main(int c,char**a)
{int n=(*++a&&(_(*a,(*a[0]=='-')&&(*a[1]=='n'))));
 for(;*a;_(*a,putchar(' ')))fputs(*a,stdout);_(n,putchar('
'));
 return 0;}

Name: Anonymous 2011-01-07 7:29

>>32
Fuck, my BBCode parsed \n as newline.
#include<stdio.h>
#include<stdlib.h>
#define _(x,y) ((*(x))&&(y))
main(int c,char**a)
{int n=(*++a&&(_(*a,(*a[0]=='-')&&(*a[1]=='n'))));
 for(;*a;_(*a,putchar(' ')))fputs(*a,stdout);_(n,putchar('\n'));
 return 0;}

Name: Anonymous 2011-01-07 8:10

>>33
s/((*(x))/((x)/
FTFY

Name: Anonymous 2011-01-07 8:54

>>33
That would make no difference anyway.

Name: Anonymous 2011-01-07 10:14

>>13

Please submit this code to OpenBSD

Name: Anonymous 2011-01-07 10:27

#define public_cALLOc    calloc
#define public_fREe      free
#define public_cFREe     cfree
#define public_mALLOc    malloc
#define public_mEMALIGn  memalign
#define public_rEALLOc   realloc
#define public_vALLOc    valloc
#define public_pVALLOc   pvalloc
#define public_mALLINFo  mallinfo
#define public_mALLOPt   mallopt
#define public_mTRIm     malloc_trim
#define public_mSTATs    malloc_stats
#define public_mUSABLe   malloc_usable_size
#define public_iCALLOc   independent_calloc
#define public_iCOMALLOc independent_comalloc
#define public_gET_STATe malloc_get_state
#define public_sET_STATe malloc_set_state


gODFUQINDAMn

Name: Anonymous 2011-01-07 10:33

>>36
You submit that code to OpenBSD, I will not reveal myself!

Name: Anonymous 2011-01-07 10:55

>>37
ALLO?
STATU
SABLE

Name: Anonymous 2011-01-07 11:56

>>38
Fuck you man, get some balls.
At least I'm brave enough to admin... that I'm afraid of Theo de Raadt.

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List