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; }