Exemple #1
0
			uint64_t read(unsigned int bits)
			{
				bitsread += bits;
				
				if ( bits <= wordfill || bits <= buffer_data_type_bits )
				{
					fillWord(bits);
					uint64_t const mask = ::libmaus::math::lowbits(bits) << (wordfill-bits);
					uint64_t const val = (word & mask) >> (wordfill-bits);
					word &= ~mask;
					wordfill -= bits;
					return val;
				}
/*
 Dynamicznie alokuje pamiec wczytujac slowa do listy dwukierunkowej wyrazow.

 Lista jest uznawana za poprawna jesli kazde slowo ma szanse zmiescic sie w dowolnej kolumnie i zawiera jakikolwiek wyraz.

 Parametry:
 - Words:   struktura pomocnicza listy slow,
 - S1:      dlugosc pierwszej kolumny,
 - S2:      dlugosc drugiej kolumny.

 Zwracana wartosc:
 1 jesli udalo sie wczytac liste i jest poprawna, 0 jesli lista jest nieprawidlowa lub nie udalo sie jej wczytac.
*/
int readWords (WordsHandler *Words, const int S1, const int S2) {
         /* Lancuch do pobierania danych z wejscia. */
    char OriginalString [3*LineLength];

        /* Ktory znak strumienia wejsciowego jest obecnie przetwarzany. */
    int CurrentSign = 0,
        /* Dlugosc biezacego wyrazu (binarna, po uwzglednieniu znakow spoza ASCII moze byc inna). */
        CurrentLength = 0;

    /* Przygotwanie do pobierania slow */
    Words->First = NULL;
    if (addNewWord (Words) == NULL) {
        printf ("Memory allocation error!\n");
        return 0;
    }

    /* Wczytywanie wyrazow do dynamicznie alokowanej pamieci. */

    while (scanf ("%s", OriginalString) != -1 && OriginalString [0] != EOF) {
        /* Obliczanie wymaganej pamieci wymaganej dla wyrazu i usuwanie ew. bialych znakow z tesktu. */
        for (CurrentSign = 0; OriginalString [CurrentSign] != '\0'; CurrentSign++)
            if (OriginalString [CurrentSign] != '\n' && OriginalString [CurrentSign] != ' ' && OriginalString [CurrentSign] != '\r' && OriginalString [CurrentSign] != '\t')
                CurrentLength++;

        /* Jesli nie udalo sie zaalokowac pamieci, zwalnia dotychczas zaalokowana pamiec i przerywa program. */
        if (CurrentLength != 0 && (fillWord (OriginalString, Words->CurrentForward, CurrentLength, CurrentSign) == NULL || addNewWord (Words) == NULL) ) {
            printf ("Memory allocation error!\n");
            return 0;
        }

        CurrentSign = 0;
        CurrentLength = 0;
    }

    /* Zakonczenie programu jesli nie wczytano zadnych wyrazow. */
    if (Words->First->Length == 0)
        return 0;

    /* Zabezpiecznie przed pustym ostatnim wyrazem. */
    correctWords (Words);

    /* Sprawdza czy wszytkie slowa sa w stanie zmiescic sie, w ktorejkolwiek  kolumn. */
    for (Words->CurrentForward = Words->First; Words->CurrentForward != NULL; Words->CurrentForward = Words->CurrentForward->Next)
        if (Words->CurrentForward->Length > S1 && Words->CurrentForward->Length > S2) {
            printf ("At least one of words was to long!\n");
            return 0;
        }

    return 1;
}