On Tue, 28 Jun 2011, Jürgen Lüters wrote:

copyright law at least in europe, northamerica and japan protects the
work computer program in our case. The law does protect programms in
binary and text form.
The law does _not_ protect ideas and concepts.

Several programs can implement the same algorithms. As long as the
implementation is different  there is no problem. That the implenmtation
is different can be shown by source code comparison. Clean room

The fact the the "implementation is different" does not mean that you can escape the copyright. This "different implementation" may still be based on earlier, copyrighted work. A source code comparison may not show this.

I'll give you an example. I downloaded ESR:s "hexdump 1.7" from http://www.catb.org/~esr/hexdump/. The C file is 289 lines long. Then, I changed a few variable names, removed the comments, changed the order of the include files and a few other trivial changes. With just these small changes, the "comparator" can no longer find any common code segments:

#SCF-B 2.0
Filtering: language
Hash-Method: RXOR
Matches: 0
Merge-Program: comparator 2.8
Normalization: line-oriented
Shred-Size: 3
%%
hexdump-mine: matches=0, matchlines=0, totallines=277
hexdump-1.7: matches=0, matchlines=0, totallines=627
%%

Does this mean that the code is now mine, that I can put my own copyright on it, that I can use it without obeying the original license, and that Eric S Raymond can no longer claim any copyright on it? No. I used his work to create "my different implementation". This means that I must still respect his copyright.

So to "work on making FreeRDP show 0% match with rdesktop" does not really help. Even if you reach this goal, the code would still be based on earlier copyrighted work, and the GPL must still be respected.


Rgds, ---
Peter Åstrand           ThinLinc Chief Developer
Cendio AB               http://www.cendio.com
Wallenbergs gata 4
583 30 Linköping        Phone: +46-13-21 46 00
#include <locale.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>

#define W_D 16          
#define MAXWIDTH 32     

typedef int Bool;
#define TRUE    1
#define FALSE   0

static long     linesize = W_D; 
static Bool     cflag = FALSE;  
static Bool     eflag = FALSE;  
static Bool     gflag = FALSE;  
static long     dWstart = 0L;   
static long     length = 0L;    

static char ebcdic[] =
{
' ','.','.','.','.','.','.','.','.','.','[','.','<','(','+','!',
'&','.','.','.','.','.','.','.','.','.',']','$','*',')',';','^',
'-','/','.','.','.','.','.','.','.','.','|',',','%','_','>','?',
'.','.','.','.','.','.','.','.','.','`',':','#','@','\'','=','"',
'.','a','b','c','d','e','f','g','h','i','.','.','.','.','.','.',
'.','j','k','l','m','n','o','p','q','r','.','.','.','.','.','.',
'.','~','s','t','u','v','w','x','y','z','.','.','.','.','.','.',
'.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.',
'{','A','B','C','D','E','F','G','H','I','.','.','.','.','.','.',
'}','J','K','L','M','N','O','P','Q','R','.','.','.','.','.','.',
'\\','.','S','T','U','V','W','X','Y','Z','.','.','.','.','.','.',
'0','1','2','3','4','5','6','7','8','9','.','.','.','.','.','.',
};

static void dumpfile(FILE *f)
{
    int     ch = '\0';          
    char    ascii[MAXWIDTH+3];  
    int     i = 0;              
    int     ai = 0;             
    int     offset = 0;         
    int     hpos;               
    long    SF = dWstart;
    long    len_f = length;
    char    *esctokens = "\b\f\n\r\t";
    char    *escapes = "bfnrt";
    char    *cp;

    do {
        ch = getc(f);

        if (ch != EOF)
        {
            if (dWstart && SF-- > 0)
                continue;

            if (length && len_f-- <= 0) {
                ch = EOF;
            }
        }

        if (ch != EOF)
        {
            if (i++ % linesize == 0)
            {
                (void) printf("%04x ", offset);
                offset += linesize;
                hpos = 5;
            }

            if (!gflag) {
                if ((i-1) % (linesize/2)==0)
                {
                    (void) putchar(' ');
                    hpos++;
                    ascii[ai++] = ' ';
                }
            }

            if (eflag)          
            {
                ascii[ai] = (ch >= 0x40) ? ebcdic[ch - 0x40] : '.';

                if (cflag && (ascii[ai] != '.' || ch == ebcdic['.']))
                    (void) printf("%c  ", ascii[ai]);
                else if (cflag && ch && (cp = strchr(esctokens, ch)))
                    (void) printf("\\%c ", escapes[cp - esctokens]);
                else
                    (void) printf("%02x ", ch);
            }
            else                
            {
                ascii[ai] = (isprint (ch) || ch == ' ') ? ch : '.';

                if (cflag && (isprint(ch) || ch == ' '))
                    (void) printf("%c  ", ch);
                else if (cflag && ch && (cp = strchr(esctokens, ch)))
                    (void) printf("\\%c ", escapes[cp - esctokens]);
                else
                    (void) printf("%02x ", ch);
            }
            ++ai;
            hpos += 3;
        }

        if (i&&(ch==EOF||(i%linesize==0)))
        {
            if (!cflag)
            {
                while (hpos < linesize * 3 + 7)
                {
                    hpos++;
                    (void) putchar(' ');
                }

                ascii[ai] = '\0';
                (void) printf("%s", ascii);
            }

            if (ch != EOF || (i % linesize != 0))
                (void) putchar('\n');
            ai = 0;             
        } /* wow, this was tricky */
    } while (ch != EOF);
}

static long getoffs(char *checkpoint)
{
    Bool foundzero = FALSE;
    long lval = 0;
    int boff = 0;
    char *numbaz = "0123456789abcdefABCDEF";
    for (;*checkpoint;checkpoint++)
        if (*checkpoint == '0')
            foundzero = TRUE;
        else if (isdigit(*checkpoint))
        {
            boff = 10;
            break;
        }
        else if (*checkpoint == 'x' || *checkpoint == 'X' || *checkpoint == 'h' 
|| *checkpoint == 'H')
        {
            checkpoint++;
            boff = 16;
            break;
        } else {
            return(-1L);
        }

    if (boff == 0)
        if (foundzero)
            boff = 10;
        else
            return(-1L);

    if (boff == 10)
    {
        for (; *checkpoint; checkpoint++)
            if (isdigit(*checkpoint))
                lval = lval * 10 + (*checkpoint - '0');
            else return(-1L);
    }
    else
    {
        for (; *checkpoint; checkpoint++)
            if (strchr(numbaz, *checkpoint))
                lval = lval*16 + (strchr(numbaz, tolower(*checkpoint))-numbaz);
            else
                return(-1L);
    }

    return(lval);
}

int main(int unix_argc, char **argv) {
    FILE    *infile;        
    int     dumpcount = 0;  
    char    *CP;

    setlocale (LC_CTYPE, "");

    for (argv++, unix_argc--; unix_argc > 0; argv++, unix_argc--)
    {
        char s = **argv;

        if (s == '-' || s == '+')
        {
            int c = *++*argv;

            switch (c)
            {
            case 'V':
                printf("hex " RELEASE " by Eric S. Raymond.\n");
                exit(0);

            case 'e': eflag = (s == '-'); continue;
            case 'c': cflag = (s == '-'); continue;
            case 'g': gflag = (s == '-'); continue;

            case 's':
                if ((*argv)[1]) {
                    (*argv)++;
                } else {
                    unix_argc--, argv++;
                }
                if (s == '-' && unix_argc >= 0)
                {
                    if (CP = strchr(*argv, ','))
                        *CP++ = '\0';
                    if ((dWstart = getoffs(*argv)) == -1L)
                    {
                        (void) fputs("hex: dWstart offset no good\n", stderr);
                        exit(0);
                    }

                    if (CP)
                        if ((length = getoffs(CP)) == -1L) {
                            (void) fputs("hex: length no good\n", stderr);
                            exit(0);
                        }
                }
                else
                    dWstart = length = 0L;
                continue;

            case '\0':
                infile = stdin;
                break;

            case 'w':
                if ((*argv)[1])
                    (*argv)++;
                else
                    unix_argc--, argv++;
                if ((linesize = getoffs(*argv)) == -1L || linesize > MAXWIDTH)
                {
                    (void) fputs("hex: line width no good\n", stderr);
                    exit(0);
                }
                if (linesize % 2)
                    gflag = TRUE;
                continue;

            default:
                (void) fprintf(stderr, "hex: no such option as %s\n", *argv);
                exit(0);
            }
        }
        else if ((infile = fopen(*argv, "rb")) == NULL)
        {
            (void) fprintf(stderr, "hex: cannot open %s\n", *argv);
            exit(1);
        }

        if (dumpcount > 0 || unix_argc > 1)
            if (infile == stdin)
                (void) printf("---- <Standard input> ----\n");
            else
                (void) printf("---- %s ----\n", *argv);
        dumpfile(infile);
        dumpcount++;
        if (infile != stdin)
            (void) fclose(infile);
    }

    if (dumpcount == 0)
        dumpfile(stdin);
    return(0);
}

------------------------------------------------------------------------------
All of the data generated in your IT infrastructure is seriously valuable.
Why? It contains a definitive record of application performance, security 
threats, fraudulent activity, and more. Splunk takes this data and makes 
sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-d2d-c2
_______________________________________________
Freerdp-devel mailing list
Freerdp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/freerdp-devel

Reply via email to