Changeset 8d96dee for libcfa


Ignore:
Timestamp:
Aug 14, 2023, 1:27:56 PM (2 years ago)
Author:
caparsons <caparson@…>
Branches:
master
Children:
3543e99
Parents:
89bef959 (diff), d32679d5 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc

Location:
libcfa/src/containers
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/containers/string.cfa

    r89bef959 r8d96dee  
    1010// Created On       : Fri Sep 03 11:00:00 2021
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Aug  7 10:07:26 2023
    13 // Update Count     : 2
     12// Last Modified On : Sat Aug 12 15:24:18 2023
     13// Update Count     : 6
    1414//
    1515
     
    100100
    101101////////////////////////////////////////////////////////
    102 // Output
    103 
    104 ofstream & ?|?( ofstream & fs, const string & this ) {
    105     return fs | (*this.inner);
    106 }
    107 
    108 void ?|?( ofstream & fs, const string & this ) {
    109     fs | (*this.inner);
    110 }
     102// Input-Output
     103
     104ofstream & ?|?( ofstream & out, const string & this ) {
     105    return out | (*this.inner); // print internal string_res
     106}
     107
     108void ?|?( ofstream & out, const string & this ) {
     109    (ofstream &)(out | (*this.inner)); ends( out );
     110}
     111
     112ifstream & ?|?(ifstream &in, string &this) {
     113    return in | (*this.inner); // read to internal string_res
     114}
     115
    111116
    112117////////////////////////////////////////////////////////
  • libcfa/src/containers/string.hfa

    r89bef959 r8d96dee  
    5555ofstream & ?|?(ofstream &out, const string &s);
    5656void ?|?(ofstream &out, const string &s);
     57ifstream & ?|?(ifstream &in, string &s);
    5758
    5859// Concatenation
  • libcfa/src/containers/string_res.cfa

    r89bef959 r8d96dee  
    1010// Created On       : Fri Sep 03 11:00:00 2021
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jun 29 09:29:06 2023
    13 // Update Count     : 2
     12// Last Modified On : Sat Aug 12 15:37:47 2023
     13// Update Count     : 10
    1414//
    1515
     
    1717#include "string_sharectx.hfa"
    1818#include "stdlib.hfa"
     19#include <ctype.h>
    1920
    2021// Workaround for observed performance penalty from calling CFA's alloc.
     
    134135        serr | nlOff;
    135136        serr | " lnth:" | lnth | " s:" | (void *)s | ",\"";
    136         for ( int i = 0; i < lnth; i += 1 ) {
     137        for ( i; lnth ) {
    137138            serr | s[i];
    138139        } // for
     
    198199// Output operator
    199200ofstream & ?|?(ofstream &out, const string_res &s) {
    200     // Store auto-newline state so it can be restored
    201     bool anl = getANL$(out);
    202     nlOff(out);
    203     for (size_t i = 0; i < s.Handle.lnth; i++) {
    204         out | s[i];
    205     }
    206     out | sepVal;
    207     // Re-apply newlines after done, for chaining version
    208     if (anl) nlOn(out);
     201        // CFA string is NOT null terminated, so print exactly lnth characters in a minimum width of 0.
     202        out | wd( 0, s.Handle.lnth, s.Handle.s ) | nonl;
    209203    return out;
    210204}
    211205
    212206void ?|?(ofstream &out, const string_res &s) {
    213     // Store auto-newline state so it can be restored
    214     bool anl = getANL$(out);
    215     if( s.Handle.lnth == 0 ) {
    216         sout | "";
    217     } else {
    218         nlOff(out);
    219         for (size_t i = 0; i < s.Handle.lnth; i++) {
    220             // Need to re-apply on the last output operator, for whole-statement version
    221             if (anl && i == s.Handle.lnth-1) nlOn(out);
    222             out | s[i];
    223         }
    224     }
    225 }
     207        (ofstream &)(out | s); ends( out );
     208}
     209
     210// Input operator
     211ifstream & ?|?(ifstream &in, string_res &s) {
     212
     213    // Reading into a temp before assigning to s is near zero overhead in typical cases because of sharing.
     214    // If s is a substring of something larger, simple assignment takes care of that case correctly.
     215    // But directly reading a variable amount of text into the middle of a larger context is not practical.
     216    string_res temp;
     217
     218    // Read in chunks.  Often, one chunk is enough.  Keep the string that accumulates chunks last in the heap,
     219    // so available room is rest of heap.  When a chunk fills the heap, force growth then take the next chunk.
     220    for (;;) {
     221        // Append dummy content to temp, forcing expansion when applicable (occurs always on subsequent loops)
     222        // length 2 ensures room for at least one real char, plus scanf/pipe-cstr's null terminator
     223        temp += "--";
     224        assert( temp.Handle.ulink->EndVbyte == temp.Handle.s + temp.Handle.lnth );    // last in heap
     225
     226        // reset, to overwrite the appended "--"
     227        temp.Handle.lnth -= 2;
     228        temp.Handle.ulink->EndVbyte -= 2;
     229
     230        // rest of heap, less 1 byte for null terminator, is available to read into
     231        int lenReadable = (char*)temp.Handle.ulink->ExtVbyte - temp.Handle.ulink->EndVbyte - 1;
     232        assert (lenReadable >= 1);
     233
     234        // get bytes
     235        in | wdi( lenReadable, temp.Handle.ulink->EndVbyte );
     236        int lenWasRead = strlen(temp.Handle.ulink->EndVbyte);
     237
     238        // update metadata
     239        temp.Handle.lnth += lenWasRead;
     240        temp.Handle.ulink->EndVbyte += lenWasRead;
     241
     242      if (lenWasRead < lenReadable) break;
     243    }
     244
     245    s = temp;
     246    return in;
     247}
     248
    226249
    227250// Empty constructor
     
    338361    // adjust all substring string and handle locations, and check if any substring strings are outside the new base string
    339362    char *limit = resultSesStart + resultSesLnth;
    340     for (string_res * p = this.shareEditSet_next; p != &this; p = p->shareEditSet_next) {
     363    for ( string_res * p = this.shareEditSet_next; p != &this; p = p->shareEditSet_next ) {
    341364        verify (p->Handle.s >= beforeBegin);
    342365        if ( p->Handle.s >= afterBegin ) {
     
    391414}
    392415
    393 static string_res & assign_(string_res &this, const char* buffer, size_t bsize, const string_res & valSrc) {
    394 
    395     // traverse the incumbent share-edit set (SES) to recover the range of a base string to which `this` belongs
    396     string_res * shareEditSetStartPeer = & this;
    397     string_res * shareEditSetEndPeer = & this;
     416// traverse the share-edit set (SES) to recover the range of a base string to which `this` belongs
     417static void locateInShareEditSet( string_res &this, string_res *&shareEditSetStartPeer, string_res *&shareEditSetEndPeer ) {
     418    shareEditSetStartPeer = & this;
     419    shareEditSetEndPeer = & this;
    398420    for (string_res * editPeer = this.shareEditSet_next; editPeer != &this; editPeer = editPeer->shareEditSet_next) {
    399421        if ( editPeer->Handle.s < shareEditSetStartPeer->Handle.s ) {
     
    404426        }
    405427    }
     428}
     429
     430static string_res & assign_(string_res &this, const char* buffer, size_t bsize, const string_res & valSrc) {
     431
     432    string_res * shareEditSetStartPeer;
     433    string_res * shareEditSetEndPeer;
     434    locateInShareEditSet( this, shareEditSetStartPeer, shareEditSetEndPeer );
    406435
    407436    verify( shareEditSetEndPeer->Handle.s >= shareEditSetStartPeer->Handle.s );
     
    589618
    590619bool contains(const string_res &s, char ch) {
    591     for (i; size(s)) {
     620    for ( i; size(s) ) {
    592621        if (s[i] == ch) return true;
    593622    }
     
    643672    }
    644673
    645     for (size_t i = fromPos; i < s.Handle.lnth; i++) {
     674    for ( i; fromPos ~ s.Handle.lnth ) {
    646675        size_t remaining = s.Handle.lnth - i;
    647676        // Never going to find the search string if the remaining string is
     
    652681
    653682        bool matched = true;
    654         for (size_t j = 0; j < searchsize; j++) {
     683        for ( j; searchsize ) {
    655684            if (search[j] != s.Handle.s[i + j]) {
    656685                matched = false;
     
    740769
    741770int exclude(const string_res &s, const charclass_res &mask) {
    742     for (int i = 0; i < size(s); i++) {
     771    for ( i; size(s) ) {
    743772        if ( test(mask, s[i]) ) return i;
    744773    }
     
    747776
    748777int include(const string_res &s, const charclass_res &mask) {
    749     for (int i = 0; i < size(s); i++) {
     778    for ( i; size(s) ) {
    750779        if ( ! test(mask, s[i]) ) return i;
    751780    }
     
    775804                for ( HandleNode *ni = HeaderPtr->flink; ni != HeaderPtr; ni = ni->flink ) {
    776805                        serr | "\tnode:" | ni | " lnth:" | ni->lnth | " s:" | (void *)ni->s | ",\"";
    777                         for ( int i = 0; i < ni->lnth; i += 1 ) {
     806                        for ( i; ni->lnth ) {
    778807                                serr | ni->s[i];
    779808                        } // for
     
    881910        for ( HandleNode *n = HeaderPtr->flink; n != HeaderPtr; n = n->flink ) {
    882911            serr | "\tnode:" | n | " lnth:" | n->lnth | " s:" | (void *)n->s | ",\"";
    883             for ( int i = 0; i < n->lnth; i += 1 ) {
    884                 serr | n->s[i];
     912            for ( i; n->lnth ) {
     913                        serr | n->s[i];
    885914            } // for
    886915            serr | "\" flink:" | n->flink | " blink:" | n->blink | nl;
     
    960989    EndVbyte = StartVbyte;
    961990    h = Header.flink;                                   // ignore header node
    962     for (;;) {
     991    for () {
    963992                memmove( EndVbyte, h->s, h->lnth );
    964993                obase = h->s;
     
    9711000                // check if any substrings are allocated within a string
    9721001               
    973                 for (;;) {
     1002                for () {
    9741003                        if ( h == &Header ) break;                      // end of header list ?
    9751004                        if ( h->s >= limit ) break;                     // outside of current string ?
     
    10011030                        serr | nlOff;
    10021031                        serr | "\tnode:" | n | " lnth:" | n->lnth | " s:" | (void *)n->s | ",\"";
    1003                         for ( int i = 0; i < n->lnth; i += 1 ) {
     1032                        for ( i; n->lnth ) {
    10041033                                serr | n->s[i];
    10051034                        } // for
     
    10361065                        serr | nlOff;
    10371066                        serr | "\tnode:" | n | " lnth:" | n->lnth | " s:" | (void *)n->s | ",\"";
    1038                         for ( int i = 0; i < n->lnth; i += 1 ) {
     1067                        for ( i; n->lnth ) {
    10391068                                serr | n->s[i];
    10401069                        } // for
  • libcfa/src/containers/string_res.hfa

    r89bef959 r8d96dee  
    99// Author           : Michael L. Brooks
    1010// Created On       : Fri Sep 03 11:00:00 2021
    11 // Last Modified By : Michael L. Brooks
    12 // Last Modified On : Fri Sep 03 11:00:00 2021
    13 // Update Count     : 1
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Aug 12 15:45:47 2023
     13// Update Count     : 2
    1414//
    1515
     
    3030    VbyteHeap *ulink;                   // upward link
    3131
    32     char *s;                                            // pointer to byte string
     32    char *s;                                                    // pointer to byte string
    3333    unsigned int lnth;                                  // length of byte string
    3434}; // HandleNode
     
    101101ofstream & ?|?(ofstream &out, const string_res &s);
    102102void ?|?(ofstream &out, const string_res &s);
     103ifstream & ?|?(ifstream &in, string_res &s);
    103104
    104105// Concatenation
Note: See TracChangeset for help on using the changeset viewer.