Welcome, guest! Login / Register - Why register?
Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)

Paste

Pasted as C by DoktorZhor ( 16 years ago )
/*
 * Soubor:  proj1.c
 * Autor:   Tomáš Dlabka, [email protected]
 * Projekt: Jednoduchá komprese textu, projekt è. 1 pro pøedmìt IZP
 * Popis:   Program komprimuje nebo dekomprimuje text dle zadaných parametrù.
 */

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

/* Fce */

void help(void); /* tiskne napovedu */
void compression(char *p); /* spusti kompresi */
void decompression(char *p); /* spusti dekompresi */
void addchar(char c); /* Komprese - nacteni znaku do bufferu */
void comp(int i); /* Komprese - komprese */
void decomp(int i); /* Dekomprese - dekomprese */


/* Globalni promenne - Komprese */

char    *buffer /* FIFO buffer */ ,
        *matchbuffer /* buffer pro ukladani shodnych znaku */;

int     first = 0 /* prvni pole bufferu (vystup) */ ,
        last = 0 /* posledni pole bufferu (vstup) */,
        matchc = 0 /* citac shodnych znaku */ ,
        blockmatch = 1 /* citac shodnych bloku */,
        mbindex = 0 /* index matchbufferu */,
        i, N;


/* nacteni znaku do bufferu */

void addchar(char c) {
    if ((last + 1) % (2 * N) != first) {
                buffer[last] = c;
                last = (last + 1) % (2 * N);
        }
        else {
            int i;
            buffer[last] = c;
            for (i = 0; i < last + 2; i++) {
                buffer[i] = buffer[i + 1];
            }
        }
}

/* komprese */

void comp(int i) {

    if (buffer[first] == buffer[first + N]) { /* kontrola shody znaku */
                matchbuffer[mbindex] = buffer[first]; /* zapise shodny znak do matchbufferu */
                mbindex++; /* navysi index mathcbufferu */
                matchc++; /* navysi citac shodnych znaku */
                if (matchc == N) {
                    blockmatch++; /* pokud pocet shodnych znaku = N, navysi citac shodnych bloku */
                    matchc = 0;
                }
            }
            else if (matchc != 0 && blockmatch > 1) { /* ..po opakovani nasleduji
                dalsi shodne znaky */
                putchar('0' + blockmatch);
                for(i = 0; i < matchc; i++) {/* vypise opakovany retezec z matchbufferu */
                    putchar(matchbuffer[i]);
                }
                blockmatch = 1;
                mbindex = 0;
                matchc = 0;
                putchar(buffer[first]); /* zapis z bufferu*/
            }

            else if (matchc != 0 && blockmatch == 1) { /* ..opakujici se znaky
                delky < N */
                for(i = 0; i < matchc; i++) {/* vypise opakovany retezec z matchbufferu*/
                    putchar(matchbuffer[i]);
                }
                mbindex = 0;
                matchc = 0;
                putchar(buffer[first]);
            }

            else { /* ..po opakovani nasleduje rozdilny znak */
                if (blockmatch > 1) {
                    putchar('0' + blockmatch);/* vypise pocet shodnych bloku*/
                    blockmatch = 1;
                    mbindex = 0;
                    matchc = 0;
                }
                putchar(buffer[first]);
            }
}

/* Fce compression */

void compression(char *p) {

    char input /* vstupni znak */ ;

    int bcondition = 0 /* podminka spoustejici vypis */ ;


    N = atoi(p);

    if (N < 2 || N > 9) { /* kontrola spravnosti parametru */
        printf("Nespravny parametr!");
    }
    else {
        matchbuffer = (char *) malloc(((2 * N) - 1) * sizeof(char));
        buffer = (char *) malloc(2 * N * sizeof(char));

        printf("Zadejte vstup: ");

        do {
            if (input != '\n') {
                input = getchar(); /* zapis do bufferu */
            }

            if (isdigit(input)) { /* najde-li na vstupu cislo, zahlasi chybu */
                printf(" Chybny vstup!");
                break;
            }
            else if(isprint(input) || input == '\n') { /* pokud je na vstupu tisknutelny znak probehne komprese, pri \n
                se cyklus prerusi */

                addchar(input);

                if (bcondition != (2 * N) - 1) /* navysovani podminky pro zacatek vystupu */
                    bcondition++;

                if (bcondition == (2 * N) - 1)
                /* podminka pro zamezeni opakovanemu vypisu prvniho clene pred nactenim bufferu */
                comp(i); /* volani kompresni fce */
            }
            else {
                printf("Chybny vstup!"); /* najde-li na vstupu netisknutelny znak, zahlasi chybu*/
                break;
            }

        } while (buffer[first] != '\n');
    }
    free(buffer);
    free(matchbuffer);
}


/* Fce main */

int main(int argc, char *argv[])
{
    if (argc == 2 && strcmp("-h", argv[1]) == 0) { /* print help */
        help();
        return 0;
    }

    else if (argc == 3 && strcmp("-c", argv[1]) == 0 ) { /* komprese */
         compression(argv[2]);
         return 0;
    }

    else if (argc == 3 && strcmp("-d", argv[1]) == 0) { /* dekomprese */
        decompression(argv[2]);
        return 0;
    }
}

/* Fce help */

void help(void) {
    printf(":: Help :: \n \n");
    printf("Program Jednoducha komprese \n");
    printf("Autor: Tomas Dlabka \n");
    printf("Program provadi jednoduchou kompresi textu v zavislosti na velikosti uzivatelem urceneho parametru N. \n");
    printf("Pouziti: \n");
    printf("    projekt1 -h     - tiskne napovedu \n");
    printf("    projekt1 -c N   - spusti kompresi retezcu o delce N \n");
    printf("    projekt1 -h N   - spusti dekompresi retezcu o delce N \n");
}

/* Fce - dekomprese */

void decompression(char *p) {

    char    input /* vstupni znak */ ;

    int bcondition = 0 /* podminka spoustejici vypis */ ;

    N = atoi(p);

    if (N < 2 || N > 9) { /* kontrola spravnosti parametru */
        printf("Nespravny parametr!");
    }
    else {
        matchbuffer = (char *) malloc(((2 * N) - 1) * sizeof(char));
        buffer = (char *) malloc(2 * N * sizeof(char));

        printf("Zadejte vstup: ");

        do {
            if (input != '\n') {
                input = getchar(); /* zapis do bufferu */
            }

            if(isprint(input) || input == '\n') { /* pokud je na vstupu tisknutelny znak probehne dekomprese, pri \n
                se cyklus prerusi */

                addchar(input);

                if (bcondition != (2 * N) - 1) /* navysovani podminky pro zacatek vystupu */
                    bcondition++;

                if (bcondition == (2 * N) - 1)
                /* podminka pro zamezeni opakovanemu vypisu prvniho clene pred nactenim bufferu */
                decomp(i); /* volani dekompresni fce */
            }
            else {
                printf("Chybny vstup!"); /* najde-li na vstupu netisknutelny znak, zahlasi chybu*/
                break;
            }

        } while (buffer[first] != '\n');
    }

    free(buffer);
    free(matchbuffer);
}

void decomp(int i) {

    char repeat; /* pocet opakovani */
    char crepeat = '0'; /* pocet opakovani cyklu */

    if (isdigit(buffer[first])) { /* vyskytne-li se na vstupu cislice.. */
        repeat = (buffer[first]); /* .. ulozi pocet opakovani retezce.. */
        while (crepeat < repeat - 1) { /* a vypise retezec repeat - 1 -krat (posledni opakovani se opise - line 247) */
            for(i = 1; i <= N; i++) {
                putchar(buffer[i]);
            }
            crepeat++;
        }
    }
    else {
    putchar(buffer[first]); /* opise znak na vystup */
    }
}

 

Revise this Paste

Your Name: Code Language: