Loading ...
Sorry, an error occurred while loading the content.

Re: A performance question (patch included)

Expand Messages
  • Yakov Lerner
    ... I d suggest to raise vim error ( Filesize too big ) in getfsize() if returned result loses significant bits either with 2nd argument, or without it. ...
    Message 1 of 11 , May 26, 2007
    • 0 Attachment
      On 5/25/07, Charles E Campbell Jr <drchip@...> wrote:
      > John Beckett wrote:
      >
      > > A.J.Mechelynck wrote:
      > >
      > >> What about a different function to return, say, the number of
      > >> 1K blocks (or the number of times 2^n bytes, with a parameter
      > >> passed to the function) that a file uses?
      > >
      > >
      > > Yes, that's a much more general and better idea.
      > >
      > > Since there's probably not much need for this, I think that
      > > simplicity would be good. That is, have the function work in a
      > > fixed way with no options.
      > >
      > > Re Dr.Chip's LargeFile script: It occurs to me that another
      > > workaround would be to use system() to capture the output of
      > > 'ls -l file' or 'dir file' (need an option for which).
      > >
      > > Then do some funky editing to calculate the number of digits in
      > > the file length. If more than 9, treat file as large.
      > >
      > > I'm playing with a tiny utility to help the LargeFile script.
      > > Bluesky: Its code (64-bit file size) could potentially be
      > > incorporated in Vim. I'll post results in vim-dev.
      >
      >
      > (I've moved this over to vim-dev)
      >
      > I've attached a patch to vim 7.1 which extends getfsize(); with the
      > patch, getfsize() takes an optional
      > second parameter which gives one the ability to specify a "unitsize".
      > In other words,
      >
      > getfsize("eval.c") -> 478347 (after the patch)
      >
      > getfsize("eval.c",1000) -> 479 (truncated upwards)
      >
      > I'll be awaiting Bram's input before making use of this in LargeFile.vim !
      >
      > Regards,
      > Chip Campbell
      >
      >
      >
      >
      > *** src/o_eval.c 2007-05-25 08:52:12.000000000 -0400
      > --- src/eval.c 2007-05-25 09:04:43.000000000 -0400
      > ***************
      > *** 7094,7100 ****
      > {"getcwd", 0, 0, f_getcwd},
      > {"getfontname", 0, 1, f_getfontname},
      > {"getfperm", 1, 1, f_getfperm},
      > ! {"getfsize", 1, 1, f_getfsize},
      > {"getftime", 1, 1, f_getftime},
      > {"getftype", 1, 1, f_getftype},
      > {"getline", 1, 2, f_getline},
      > --- 7094,7100 ----
      > {"getcwd", 0, 0, f_getcwd},
      > {"getfontname", 0, 1, f_getfontname},
      > {"getfperm", 1, 1, f_getfperm},
      > ! {"getfsize", 1, 2, f_getfsize},
      > {"getftime", 1, 1, f_getftime},
      > {"getftype", 1, 1, f_getftype},
      > {"getline", 1, 2, f_getline},
      > ***************
      > *** 10135,10142 ****
      > {
      > if (mch_isdir(fname))
      > rettv->vval.v_number = 0;
      > ! else
      > rettv->vval.v_number = (varnumber_T)st.st_size;
      > }
      > else
      > rettv->vval.v_number = -1;
      > --- 10135,10151 ----
      > {
      > if (mch_isdir(fname))
      > rettv->vval.v_number = 0;
      > ! else if (argvars[1].v_type == VAR_UNKNOWN)
      > rettv->vval.v_number = (varnumber_T)st.st_size;
      > + else
      > + {
      > + unsigned long unitsize;
      > + unsigned long stsize;
      > + unitsize= get_tv_number(&argvars[1]);
      > + stsize= st.st_size/unitsize;
      > + if(stsize*unitsize < st.st_size) ++stsize;
      > + rettv->vval.v_number = (varnumber_T) stsize;
      > + }
      > }
      > else
      > rettv->vval.v_number = -1;
      > *** runtime/doc/o_eval.txt 2007-05-25 09:00:08.000000000 -0400
      > --- runtime/doc/eval.txt 2007-05-25 09:06:19.000000000 -0400
      > ***************
      > *** 1615,1621 ****
      > getcmdtype() String return the current command-line type
      > getcwd() String the current working directory
      > getfperm( {fname}) String file permissions of file {fname}
      > ! getfsize( {fname}) Number size in bytes of file {fname}
      > getfontname( [{name}]) String name of font being used
      > getftime( {fname}) Number last modification time of file
      > getftype( {fname}) String description of type of file {fname}
      > --- 1615,1621 ----
      > getcmdtype() String return the current command-line type
      > getcwd() String the current working directory
      > getfperm( {fname}) String file permissions of file {fname}
      > ! getfsize( {fname} [,unitsize]) Number size in bytes of file {fname}
      > getfontname( [{name}]) String name of font being used
      > getftime( {fname}) Number last modification time of file
      > getftype( {fname}) String description of type of file {fname}
      > ***************
      > *** 2819,2827 ****
      > getcwd() The result is a String, which is the name of the current
      > working directory.
      >
      > ! getfsize({fname}) *getfsize()*
      > The result is a Number, which is the size in bytes of the
      > given file {fname}.
      > If {fname} is a directory, 0 is returned.
      > If the file {fname} can't be found, -1 is returned.
      >
      > --- 2819,2829 ----
      > getcwd() The result is a String, which is the name of the current
      > working directory.
      >
      > ! getfsize({fname} [,unitsize]) *getfsize()*
      > The result is a Number, which is the size in bytes of the
      > given file {fname}.
      > + If unitsize is given, then the file {fname}'s size will be
      > + returned in units of size unitsize bytes (truncated up).
      > If {fname} is a directory, 0 is returned.
      > If the file {fname} can't be found, -1 is returned.
      >
      >
      >

      I'd suggest to raise vim error ("Filesize too big") in getfsize()
      if returned result loses significant bits either with 2nd argument, or
      without it.

      The check can be like this:
      > ! else if (argvars[1].v_type == VAR_UNKNOWN) {
      > rettv->vval.v_number = (varnumber_T)st.st_size;
      if( (off_t)rettv->vval.v_number != st.st_size)
      raise vim error;
      > + } else

      and similar for the branch with 2nd arg. But then stsize would need to
      be declared of type off_t instead of 'unsingned long' to be able to
      check for overflow
      probably.

      Yakov
    Your message has been successfully submitted and would be delivered to recipients shortly.