<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
  </head>
  <body bgcolor="#ffffff" text="#000000">
    Hi Nicola,<br>
    <br>
    On 10/23/2021 6:56 PM, Nicola Mingotti via Cuis-dev wrote:
    <blockquote
      cite="mid:09116dd9-b71a-aefb-8d8b-bd0ebbbb14fd@gmail.com"
      type="cite">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <br>
      Hi Juan,<br>
      <br>
      At the best of my current undestanding I can provide this:<br>
      <br>
      1. Fileout for tests in BaseImageTests<br>
    </blockquote>
    <br>
    Much better!<br>
    <br>
    <blockquote
      cite="mid:09116dd9-b71a-aefb-8d8b-bd0ebbbb14fd@gmail.com"
      type="cite"> 2. A few fileout for new methods and method names<br>
    </blockquote>
    <br>
    I still think the focus should be on terminator vs. separator,
    especially on method and argument names. See
    <a class="moz-txt-link-freetext" href="https://en.wikipedia.org/wiki/Newline">https://en.wikipedia.org/wiki/Newline</a> :<br>
    <br>
    "Interpretation<br>
    Two ways to view newlines, both of which are self-consistent, are
    that newlines either separate lines or that they terminate lines. If
    a newline is considered a separator, there will be no newline after
    the last line of a file. Some programs have problems processing the
    last line of a file if it is not terminated by a newline. On the
    other hand, programs that expect newline to be used as a separator
    will interpret a final newline as starting a new (empty) line.
    Conversely, if a newline is considered a terminator, all text lines
    including the last are expected to be terminated by a newline. If
    the final character sequence in a text file is not a newline, the
    final line of the file may be considered to be an improper or
    incomplete text line, or the file may be considered to be improperly
    truncated. "<br>
    <br>
    <blockquote
      cite="mid:09116dd9-b71a-aefb-8d8b-bd0ebbbb14fd@gmail.com"
      type="cite"> 3. I could not replicate the bug you say, I did not
      understand well maybe. if you could send me <br>
      a fail example it would be helpful.<br>
      <br>
    </blockquote>
    <br>
    Sure. The following test fails even after fixing the obvious bug:<br>
    <br>
    testUpToStrict3<br>
        | path fs read |<br>
        path := 'test-{1}.txt' format: {(Float pi * 10e10) floor. } .<br>
        path asFileEntry fileContents: ((1 to: 100) inject: '' into: [
    :prev :each | prev, 'A lot of stuff, needs over 2000 chars! ']). <br>
        fs := path asFileEntry readStream.<br>
        read := fs upTo: $X strict: true.<br>
        self assert: (read =  nil).<br>
        fs close.<br>
    <br>
    <blockquote
      cite="mid:09116dd9-b71a-aefb-8d8b-bd0ebbbb14fd@gmail.com"
      type="cite"> <br>
      bye<br>
      Nicola<br>
      <br>
    </blockquote>
    <br>
    Cheers,<br>
    <br>
    <blockquote
      cite="mid:09116dd9-b71a-aefb-8d8b-bd0ebbbb14fd@gmail.com"
      type="cite"> <br>
      <div class="moz-cite-prefix">On 10/23/21 02:26, Nicola Mingotti
        wrote:<br>
      </div>
      <blockquote type="cite"
        cite="mid:5f2ef2d5-71ed-ddd8-962d-5ad63a8301ed@gmail.com">
        <meta http-equiv="Content-Type" content="text/html;
          charset=UTF-8">
        <br>
        Hi Juan, let me a bit of time to read your references, I thought
        what I sent were test methods,<br>
        clearly i miss part of the story.<br>
        <br>
        There shouldn't be any concatenation of nil and for God sake NO
        partial records. <br>
        This is what I wanted to avoid, apologies. <br>
        <br>
        Tomorrow i will probably be out for the Linux day, i will update
        when possible.<br>
        <br>
        <br>
        bye<br>
        Nicola<br>
        <br>
        <br>
        <br>
        <br>
        <div class="moz-cite-prefix">On 10/23/21 01:20, Juan Vuletich
          wrote:<br>
        </div>
        <blockquote type="cite"
          cite="mid:61734724.5010009@jvuletich.org">
          <meta content="text/html; charset=UTF-8"
            http-equiv="Content-Type">
          Hi Folks,<br>
          <br>
          The main point here is not "strict vs. legacy", "logically
          correct vs incorrect" or anything like that at all.<br>
          <br>
          The point is "separator vs. terminator", and how using a
          terminator instead of a separator allows processing files
          while they are still being written to. (And this has really no
          relation with running on a server or any other kind of
          machine.)<br>
          <br>
          Besides, Nicola, your code has a bug when recurring on
          terminator: it will answer the previous partial last record
          concatenated with nil.<br>
          <br>
          Finally, please take a look at TestCase,SUnit and
          BaseImageTests.pck.st to see what we mean by a "test".<br>
          <br>
          Thanks,<br>
          <br>
          On 10/22/2021 12:18 PM, Nicola Mingotti via Cuis-dev wrote:
          <blockquote
            cite="mid:79ec566d-c417-6eea-ec5c-01965d0cf93e@gmail.com"
            type="cite">
            <meta http-equiv="Content-Type" content="text/html;
              charset=UTF-8">
            <br>
            Hi Hernan, <br>
            <br>
            We will have opportunity to work together on larger
            problems, this is too small.<br>
            It would take more time to talk than to do things ;)<br>
            <br>
            I have a proposed version. I rewrote the methods. wrote the
            test. I kept a good part<br>
            of the original code which may have evolved for efficiency
            over time.<br>
            <br>
            upToLegacy method can of course be eliminated. it is there
            only for reference. <br>
            <br>
            upTo: XXX --- now calls --->  upTo: XXX strict: false <br>
            <br>
            upTo: XXX strict: XXX ------ is recursive, it needs an extra
            helper method to remember a parameter (Scheme recursion
            style)  ----> upTo: XXX strict: XXX posMemo: xxxx<br>
            <br>
            See attached fileout<br>
            <br>
            <br>
            bye<br>
            Nicola<br>
            <br>
            <br>
            <br>
            <br>
            <br>
            <div class="moz-cite-prefix">On 10/21/21 19:49, Hernan
              Wilkinson wrote:<br>
            </div>
            <blockquote type="cite"
cite="mid:CAJAbP8jpOucdF34SNqQFVavbKdozS294rbpLsT4pXO9165hdcg@mail.gmail.com">
              <meta http-equiv="content-type" content="text/html;
                charset=UTF-8">
              <div dir="ltr">ok, let me know. I wish we could do it
                together but my agenda (and I guess yours) is almost
                always full...</div>
              <br>
              <div class="gmail_quote">
                <div dir="ltr" class="gmail_attr">On Thu, Oct 21, 2021
                  at 2:32 PM Nicola Mingotti <<a
                    href="mailto:nmingotti@gmail.com"
                    moz-do-not-send="true" class="moz-txt-link-freetext">nmingotti@gmail.com</a>>

                  wrote:<br>
                </div>
                <blockquote class="gmail_quote" style="margin: 0px 0px
                  0px 0.8ex; border-left: 1px solid rgb(204, 204, 204);
                  padding-left: 1ex;">
                  <div> <br>
                    Hi Hernan,<br>
                    <br>
                    ok, let me try, it is too many days i am talking
                    about it.<br>
                    <br>
                    I will let you know soon<br>
                    <br>
                    bye<br>
                    Nicola<br>
                    <br>
                    <br>
                    <br>
                    <br>
                    <div>On 10/21/21 19:02, Hernan Wilkinson wrote:<br>
                    </div>
                    <blockquote type="cite">
                      <div dir="ltr">Hi Nicolas, 
                        <div> if you could refactor upTo: to use the
                          same code as strictUpTo: and write the tests
                          to check that everything works as expected,
                          that would be great!</div>
                        <div> I would not use the names of the Linux
                          stdlib for those messages nor the C functions,
                          it is not necessary...</div>
                        <div> If you do not have the time to do it, I
                          can give it a try if you wish.</div>
                        <div><br>
                        </div>
                        <div>Cheers!</div>
                        <div>Hernan.<br>
                          <div> </div>
                        </div>
                      </div>
                      <br>
                      <div class="gmail_quote">
                        <div dir="ltr" class="gmail_attr">On Thu, Oct
                          21, 2021 at 12:47 PM Nicola Mingotti <<a
                            href="mailto:nmingotti@gmail.com"
                            target="_blank" moz-do-not-send="true"
                            class="moz-txt-link-freetext">nmingotti@gmail.com</a>>

                          wrote:<br>
                        </div>
                        <blockquote class="gmail_quote" style="margin:
                          0px 0px 0px 0.8ex; border-left: 1px solid
                          rgb(204, 204, 204); padding-left: 1ex;">
                          <div> <br>
                            Hi Hernan,<br>
                            <br>
                            . forget the code and test. I can rewrite it
                            from scratch with test. I actually changed<br>
                            existing code for "politeness" ;) <br>
                            <br>
                            . for me it is very important to have this
                            matter fixed, well and for the future.<br>
                            It is not good to have standard lib
                            functionality disseminated in my application
                            packages.<br>
                            <br>
                            . since I found Linux stdlib has a function
                            to do well what i want i will use that
                            name(s)<br>
                            to avoid confusion and recycle already
                            existing function names. "getline" and
                            "getdelim".<br>
                            <br>
                            . if you really dislike this functions I can
                            put them in OSProcess and maybe <br>
                            just link the C version only for Linux/BSD.
                            So much I think they are valuable in the
                            server environment.<br>
                            <br>
                            . to fix this i need maybe 1-2 days. If i
                            need to link the C functions I don't know,
                            since I never tried.<br>
                            <br>
                            So, let me know, if you are not against
                            these functions I am open to implement them
                            well.<br>
                            <br>
                            <br>
                            ===== Extra considerations whose reading is
                            secondary ==================<br>
                            <br>
                            . your fix was one step in the right
                            direction but not enough, you also need to<br>
                            bring back the stream pointer to the last
                            existant $A. This is to say: too complex.<br>
                            A good method must do all its chore, not
                            leave us back the dirty business and special
                            conditions.<br>
                            <br>
                            . I understand the concision, small core
                            etc. On the other side, i <br>
                            run Cuis on the servers.  the most important
                            thing there is on servers are files and<br>
                            sockets. You must read from there all of the
                            time. It must be easy and idiot proof,<br>
                            rock solid and resistant to concurrent
                            processing as far as possible.<br>
                            <br>
                            . I see that Python and Ruby standard
                            library do it wrong, at bit better than Cuis
                            'upTo' does.<br>
                            but still bad. They leave you the '\n' at
                            the end, but, if any process goes on writing<br>
                            'f1.txt' Ruby and Python lost the half
                            backed record ! <br>
                            -------- Linux<br>
                            <span style="font-family: monospace;"><span
                                style="color: rgb(0, 0, 0);
                                background-color: rgb(255, 255, 255);">$>

                                printf 'line-1\nline-2\nline-TRAP' >
                                f1.txt<br>
                                # python<br>
                                $> </span></span><span
                              style="font-family: monospace;"><span
                                style="color: rgb(0, 0, 0);
                                background-color: rgb(255, 255, 255);"><span
                                  style="font-family: monospace;"><span
                                    style="color: rgb(0, 0, 0);
                                    background-color: rgb(255, 255,
                                    255);">python3.9 -c
                                    "f=open('f1.txt','r');
                                    print(f.readlines())" </span><br>
                                </span>=> </span></span><span
                              style="font-family: monospace;"><span
                                style="color: rgb(0, 0, 0);
                                background-color: rgb(255, 255, 255);"><span
                                  style="font-family: monospace;"><span
                                    style="color: rgb(0, 0, 0);
                                    background-color: rgb(255, 255,
                                    255);">['line-1\n', 'line-2\n',
                                    'line-TRAP']</span><br>
                                  # ruby <br>
                                  $> </span></span></span><span
                              style="font-family: monospace;"><span
                                style="color: rgb(0, 0, 0);
                                background-color: rgb(255, 255, 255);"><span
                                  style="font-family: monospace;"><span
                                    style="font-family: monospace;"><span
                                      style="color: rgb(0, 0, 0);
                                      background-color: rgb(255, 255,
                                      255);">ruby -e
                                      "f=open('f1.txt','r'); puts
                                      f.readlines().to_s;  " </span><br>
                                    => ["line-1\n", "line-2\n",
                                    "line-TRAP"]<br>
                                    # both Python and Ruby ate the half
                                    backed record ! bad !<br>
                                  </span></span>---------------------------------------------------------<br>
                              </span></span><br>
                            . C and CommonLisp standard libraries have a
                            way to do it right:<br>
                            -) CL read-line. <a
href="http://www.lispworks.com/documentation/HyperSpec/Body/f_rd_lin.htm#read-line"
                              target="_blank" moz-do-not-send="true"
                              class="moz-txt-link-freetext">http://www.lispworks.com/documentation/HyperSpec/Body/f_rd_lin.htm#read-line</a>
                            <br>
                            -) C getline. <a
                              href="https://man7.org/linux/man-pages/man3/getline.3.html"
                              target="_blank" moz-do-not-send="true"
                              class="moz-txt-link-freetext">https://man7.org/linux/man-pages/man3/getline.3.html</a><br>
                            <br>
                            . I understand I am probably the only one
                            running Cuis in the server so I am the first<br>
                            to step into a few particular problems.<br>
                            <br>
                            . In my opinion Cuis in the Server can be a
                            good match, up to now i have 2 small<br>
                            company services working and a big one
                            project in continuous development. <br>
                            Time will tell. Sturdiness, undertandability
                            and ease of modification were my top
                            priority.<br>
                            Up to now things are at least working.<br>
                            <br>
======================================================<br>
                            <br>
                            bye<br>
                            Nicola<br>
                            <br>
                            <br>
                            <br>
                            <br>
                            <br>
                            <br>
                            <br>
                            <div>On 10/21/21 14:53, Hernan Wilkinson
                              wrote:<br>
                            </div>
                            <blockquote type="cite">
                              <div dir="ltr">Hi Nicola,
                                <div> I see your point regarding the
                                  functionality of upTo:, but you can
                                  easily overcome that using #peekBack.
                                  Using you example: </div>
                                <div>-----</div>
                                <div>s _ 'hello-1Ahello-2Ahel'.<br>
                                  '/tmp/test.txt' asFileEntry
                                  fileContents: s.<br>
                                  <br>
                                  st1 _ '/tmp/test.txt' asFileEntry
                                  readStream .<br>
                                  <br>
                                  st1 upTo: $A. " 'hello-1' "</div>
                                <div>st1 upTo: $A. " 'hello-2' "<br>
                                  st1 upTo: $A. " 'hel' "      </div>
                                <div>(st1 atEnd and: [ st1 peekBack ~=
                                  $A ]) ifTrue: [ self error: 'End of
                                  file without delimiter ].   <br>
                                </div>
                                <div>------</div>
                                <div> </div>
                                <div> Regarding my concern of adding
                                  this functionality to Cuis, we are
                                  trying to have a compact set of
                                  classes and methods to reduce
                                  complexity (or at least not increase
                                  it) and help newcomers to understand
                                  it and oldies to remember it :-) . We
                                  are also trying to add more and more
                                  tests because it is the only way to
                                  keep a system from becoming a legacy
                                  one and to reduce the fear it produces
                                  to change something.</div>
                                <div> The strictUpTo:startPos: you are
                                  sending is almost a copy of the upTo:
                                  method, with a few lines changed.
                                  Even though the functionality makes
                                  sense (although right now you are the
                                  only one needing it and as I said, you
                                  can use peekBack to overcome it),
                                  adding that method adds repeated code
                                  which in the long term makes it more
                                  difficult to understand and maintain,
                                  even more because it does not have
                                  tests.</div>
                                <div> So I hope you understand that as
                                  maintainers of Cuis, we want to be
                                  loyal to the goals I mentioned before
                                  and keep Cuis as clean and simple as
                                  possible. If you can refactor what you
                                  sent to avoid having repeated code
                                  with #upTo: and add tests that verify
                                  the functionality of both methods
                                  (strictUpTo: and upTo:), that will
                                  make our task easier and meet the
                                  goals we have. If you think this does
                                  not make sense to you, or you do not
                                  have the time to do it, it is
                                  completely understandable and in that
                                  case I suggest for you to have it as
                                  an extension of the StandardFileStream
                                  class or just use the peekBack message
                                  as I showed.</div>
                                <div> I hope you understand my concern
                                  and agree with me. If not, please let
                                  me know.</div>
                                <div><br>
                                </div>
                                <div>Cheers!</div>
                                <div>Hernan.</div>
                                <div><br>
                                </div>
                              </div>
                              <br>
                              <div class="gmail_quote">
                                <div dir="ltr" class="gmail_attr">On
                                  Tue, Oct 19, 2021 at 10:32 AM Nicola
                                  Mingotti <<a
                                    href="mailto:nmingotti@gmail.com"
                                    target="_blank"
                                    moz-do-not-send="true"
                                    class="moz-txt-link-freetext">nmingotti@gmail.com</a>>

                                  wrote:<br>
                                </div>
                                <blockquote class="gmail_quote"
                                  style="margin: 0px 0px 0px 0.8ex;
                                  border-left: 1px solid rgb(204, 204,
                                  204); padding-left: 1ex;">
                                  <div> <br>
                                    Hi Hernan,<br>
                                    <br>
                                    In all frankness, in I would wipe
                                    out the old 'upTo' because its
                                    behavior is a bit "wild".<br>
                                    <br>
                                    On the other side, I understand it
                                    may create problems in
                                    retro-compatibility, that is why for<br>
                                    the moment i propose to add a new
                                    method which behaves a bit better.<br>
                                    <br>
                                    I hope this example explains the
                                    problem:<br>
-------------------------------------------------------<br>
                                    s _ 'hello-1Ahello-2Ahel'.<br>
                                    '/tmp/test.txt' asFileEntry
                                    fileContents: s. <br>
                                    <br>
                                    st1 _ '/tmp/test.txt' asFileEntry
                                    readStream . <br>
                                    <br>
                                    st1 upTo: $A. " 'hello-1' "<br>
                                    st1 upTo: $A. " 'hello-2' "<br>
                                    st1 upTo: $A. " 'hel' "        
                                    "(*)"<br>
------------------------------------------------------<br>
                                    (*) You can't establish in any way
                                    if you actually found an "A"
                                    terminated block or just hit the end
                                    of file<br>
                                    (*) If you hit the end of file you
                                    eat an incomplete record, this is
                                    another problem, maybe another
                                    process<br>
                                    was going to end writing that record
                                    but you will never know. <br>
                                    <br>
                                    Maybe there is another method around
                                    that performs similarly to
                                    'strictUpTp', if there is I did not
                                    find it, sorry.<br>
                                    <br>
                                    IMHO, In a scale of importance from
                                    0 to 10, this method, for a
                                    programmer, >= 8.<br>
                                    I would definitely not put it into
                                    an external package, too much
                                    fundamental.<br>
                                    <br>
                                    bye<br>
                                    Nicola<br>
                                    <br>
                                    <br>
                                    <br>
                                    <br>
                                    <br>
                                    <br>
                                    <br>
                                    <br>
                                    <br>
                                    <br>
                                    <br>
                                    <br>
                                    <br>
                                    <br>
                                    <div>On 10/19/21 14:44, Hernan
                                      Wilkinson wrote:<br>
                                    </div>
                                    <blockquote type="cite">
                                      <div dir="ltr">Hi Nicola!<br>
                                        <div> I was wondering, why are
                                          you suggesting adding them to
                                          the base? Is it not enough to
                                          implement them as an extension
                                          in your package? </div>
                                        <div> Also, I think that any new
                                          functionality should come with
                                          its corresponding tests to
                                          help the maintenance and
                                          understanding of the
                                          functionality.</div>
                                        <div><br>
                                        </div>
                                        <div>Cheers!</div>
                                        <div>Hernan.</div>
                                        <div><br>
                                        </div>
                                      </div>
                                      <br>
                                      <div class="gmail_quote">
                                        <div dir="ltr"
                                          class="gmail_attr">On Tue, Oct
                                          19, 2021 at 7:04 AM Nicola
                                          Mingotti via Cuis-dev <<a
                                            href="mailto:cuis-dev@lists.cuis.st"
                                            target="_blank"
                                            moz-do-not-send="true"
                                            class="moz-txt-link-freetext">cuis-dev@lists.cuis.st</a>>

                                          wrote:<br>
                                        </div>
                                        <blockquote class="gmail_quote"
                                          style="margin: 0px 0px 0px
                                          0.8ex; border-left: 1px solid
                                          rgb(204, 204, 204);
                                          padding-left: 1ex;">
                                          <div> <font size="4"><font
                                                face="monospace">Hi
                                                Juan, guys,<br>
                                                <br>
                                                I would like to add to
                                                Cuis the 2 methods i
                                                attach here. One is a
                                                helper method.<br>
                                                <br>
                                                -----------<br>
                                                StandardFileStream
                                                strictUpTo: delim.<br>
                                                -----------<br>
                                                <br>
                                                Differently from 'upTo:
                                                delim' this method:<br>
                                                1. Does not return stuff
                                                if it does not find
                                                'delim'.<br>
                                                2. Does not upgrade the
                                                position on the stream
                                                if does not find
                                                'delim'.<br>
                                                3. If it finds 'delim'
                                                returns a chunk that
                                                includes it.<br>
                                                <br>
                                                I am parsing log files
                                                at the moment, this is
                                                very much useful.<br>
                                                <br>
                                                NOTE. Up to now I tested
                                                only on small files.<br>
                                                <br>
                                                bye<br>
                                                Nicola<br>
                                                <br>
                                                <br>
                                                <br>
                                                <br>
                                              </font></font> </div>
                                          -- <br>
                                          Cuis-dev mailing list<br>
                                          <a
                                            href="mailto:Cuis-dev@lists.cuis.st"
                                            target="_blank"
                                            moz-do-not-send="true"
                                            class="moz-txt-link-freetext">Cuis-dev@lists.cuis.st</a><br>
                                          <a
                                            href="https://lists.cuis.st/mailman/listinfo/cuis-dev"
                                            rel="noreferrer"
                                            target="_blank"
                                            moz-do-not-send="true"
                                            class="moz-txt-link-freetext">https://lists.cuis.st/mailman/listinfo/cuis-dev</a><br>
                                        </blockquote>
                                      </div>
                                      <br>
                                    </blockquote>
                                  </div>
                                </blockquote>
                              </div>
                            </blockquote>
                          </div>
                        </blockquote>
                      </div>
                    </blockquote>
                  </div>
                </blockquote>
              </div>
            </blockquote>
          </blockquote>
          <br>
          <pre class="moz-signature" cols="72">-- 
Juan Vuletich
<a class="moz-txt-link-abbreviated" href="http://www.cuis-smalltalk.org" moz-do-not-send="true">www.cuis-smalltalk.org</a>
<a class="moz-txt-link-freetext" href="https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev" moz-do-not-send="true">https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev</a>
<a class="moz-txt-link-freetext" href="https://github.com/jvuletich" moz-do-not-send="true">https://github.com/jvuletich</a>
<a class="moz-txt-link-freetext" href="https://www.linkedin.com/in/juan-vuletich-75611b3" moz-do-not-send="true">https://www.linkedin.com/in/juan-vuletich-75611b3</a>
@JuanVuletich</pre>
        </blockquote>
        <br>
      </blockquote>
      <br>
    </blockquote>
    <br>
    <br>
    <pre class="moz-signature" cols="72">-- 
Juan Vuletich
<a class="moz-txt-link-abbreviated" href="http://www.cuis-smalltalk.org">www.cuis-smalltalk.org</a>
<a class="moz-txt-link-freetext" href="https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev">https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev</a>
<a class="moz-txt-link-freetext" href="https://github.com/jvuletich">https://github.com/jvuletich</a>
<a class="moz-txt-link-freetext" href="https://www.linkedin.com/in/juan-vuletich-75611b3">https://www.linkedin.com/in/juan-vuletich-75611b3</a>
@JuanVuletich</pre>
  </body>
</html>