Implementing pageup pagedown feature using C language

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • ssubbarayan

    #1

    Implementing pageup pagedown feature using C language

    Dear all,
    I am in the process of implementing pageup/pagedown feature in our
    consumer electronics project.The idea is to provide feature to the
    customers to that similar to viewing a single sms message in a mobile
    device.With in the given view area if the whole message does not
    fit,we need to provide the ability for users to scroll through the
    entire message using pageup/pagedown or key up and key down.In our
    case we have the whole contents to be displayed stored in a buffer.I
    am giving below one implementation I have tried:

    Note:We are using only pure C code and dont have active x controls
    like tabs or pageup/down buttons as in .NET or VC++.

    #include <stdio.h>
    #include "string.h"


    void pageup();
    void pagedown();
    static int pagecounter=0;
    /*bytes per page calculated by trial and error
    considering the viewable area in my device*/
    int bytesperpage=16 1;
    int numpages=0;
    int contentremainin g=0;
    char* customstringcop y=NULL;
    char arr[161]={0};
    int main(int argc, char *argv[])
    {
    int totlen=0;
    int pagenum=0;


    char* customstring=NU LL;

    char* data="Bloodshed Dev-C++ is a full-featured Integrated
    Development Environment (IDE) for the C/C++ programming language. It
    uses Mingw port of GCC (GNU Compiler Collec.";
    char* stringdata="Blo odshed Dev-C++ is a full-featured Integrated
    Development Environment (IDE) for the C/C++ programming language. It
    uses Mingw port of GCC (GNU Compiler Collection) as it's compiler. Dev-
    C++ can also be used in combination with Cygwin or any other GCC based
    compiler.";
    char* stringdata1="th e #bloodshed channel has recently been
    created on the Undernet IRC server. I will be please to talk with you
    there so feel free to join :) If you want have an IRC client you can
    get one for Windows at mirc.com and for Linux at xchat.org";
    char* stringdata2="Yo u can subscribe to the Dev-C++ mailing list
    (for asking and answering questions on Dev-C++ and C/C++ programming)
    by clicking here and filling out the subscribe form there.";

    totlen=strlen(s tringdata)+strl en(stringdata)+ strlen(stringda ta2);
    printf("total length is %d\n",totlen);
    printf("length of data is %d\n",strlen(da ta) );
    customstring=(c har*)(malloc)(t otlen+4);
    customstringcop y=customstring;
    memset(customst ring,0,totlen+4 );

    memcpy(customst ring,stringdata ,strlen(stringd ata));
    customstring=cu stomstring+strl en(stringdata);
    customstring[0]='\n';
    customstring++;
    /*printf("%s\n", stringdata);
    printf("%s\n",c ustomstringcopy );*/

    /*customstring[0]='\n';
    customstring++; */

    memcpy(customst ring,stringdata 1,strlen(string data1));
    customstring=cu stomstring+strl en(stringdata1) ;
    customstring[0]='\n';
    customstring++;
    /*printf("%s\n", stringdata1);
    printf("%s\n",c ustomstringcopy );*/

    memcpy(customst ring,stringdata 2,strlen(string data2));
    customstring=cu stomstring+strl en(stringdata2) ;
    customstring[0]='\n';
    customstring++;
    /* printf("%s\n",s tringdata2);*/
    printf("%s\n",c ustomstringcopy );

    numpages=totlen/bytesperpage;
    printf("total number of pages is %d\n",numpages) ;
    contentremainin g=(totlen)%(byt esperpage);
    if(contentremai ning 0)
    {
    numpages=numpag es+1;

    }
    printf("total number of pages is %d\n",numpages) ;
    for(pagenum=0;p agenum<=numpage s;pagenum++)
    {
    pageup();
    }
    for(pagenum=num pages;pagenum>0 ;pagenum--)
    {
    pagedown();
    }
    system("PAUSE") ;
    return EXIT_SUCCESS;
    }

    void pageup()
    {


    if(pagecounter< numpages)
    {
    pagecounter++;
    printf("pagecou nter value is %d\n",pagecount er);
    memcpy(arr,cust omstringcopy,16 1);
    printf("%s\n\n" ,arr);
    customstringcop y=customstringc opy
    +bytesperpage;
    }


    }

    void pagedown()
    {

    if(pagecounter= =numpages)
    {
    pagecounter--;
    printf("pagecou nter value is %d
    \n",pagecounter );
    customstringcop y=customstringc opy-2*(bytesperpage );
    memcpy(arr,cust omstringcopy,16 1);
    printf("%s\n\n" ,arr);
    }
    else
    {
    if(pagecounter> 1)
    {
    pagecounter--;
    printf("pagecou nter value is %d
    \n",pagecounter );
    customstringcop y=customstringc opy-(bytesperpage);
    memcpy(arr,cust omstringcopy,16 1);
    printf("%s\n\n" ,arr);
    }


    }
    /* if(pagecounter> 0)
    {

    customstringcop y=customstringc opy-
    bytesperpage;
    memcpy(arr,cust omstringcopy,16 1);
    printf("%s\n\n" ,arr);

    } */

    }

    Incase you find bugs in above code please let me know ways to fix it.

    I believe there are much better ways then the one I have tried here.It
    would be helpful if some one could provide me some sample code for
    similar features you would have come across in your product or some
    sample links which shows me sample code on how to implement such a
    feature.

    Note:I am looking for only C code and not C#,JAVA,.NET,VC ++

    Looking farward for all your replies and advanced thanks for the same,
    Regards,
    s.subbarayan
  • Malcolm McLean

    #2
    Re: Implementing pageup pagedown feature using C language


    "ssubbaraya n" <ssubba@gmail.c omwrote in message
    I am in the process of implementing pageup/pagedown feature in our
    consumer electronics project.The idea is to provide feature to the
    customers to that similar to viewing a single sms message in a mobile
    device.
    >
    You can speed this up a lot.

    Hold the message in a single, contiguousm, NUL-terminated buffer (i.e. a big
    string).
    Then provide a function.

    int getNpages(char *message, int width, int height)

    Basically you count one column for a character, one line for a newline. Then
    you divide the answer by the number of lines per page.

    Now we have

    void printpage(FILE *fp, char *message, int page)

    it is essentially the same function as the previous one, counting columns
    and lines, except that when you get to the page you want, you start calling
    putchar(). No temporary buffers are required.

    --
    Free games and programming goodies.



    Comment

    • Andrew Smallshaw

      #3
      Re: Implementing pageup pagedown feature using C language

      On 2008-10-28, ssubbarayan <ssubba@gmail.c omwrote:
      >
      I believe there are much better ways then the one I have tried here.It
      would be helpful if some one could provide me some sample code for
      similar features you would have come across in your product or some
      sample links which shows me sample code on how to implement such a
      feature.
      How did you design this code? In a sense that is a rhetorical
      question because I already know how you wrote it - you opened up
      your text editor and started typing, right? It shows in the code.
      If it was me and I wanted to have some pride in my work I would
      delete it now and start over. I'd probably end up saving time in
      the long run because this code simply isn't maintainable.

      I suspect you have already spent hours bashing this code into
      shape. Next time, invest a little time in design first. Turn
      off your computer, find a pad of paper, a pencil and a rubber and
      don't go back to your computer until you know how every aspect of
      your code is going to work. Your code will go together far more
      quickly, and be much tidier and more compact to boot.

      Returning to your code, reading between the lines it appears that
      arr is supposed to represent a memory-mapped display device - this
      isn't mentioned anywhere and that is one of the first things you
      should specify in an early stage of designing your code. Similarly
      I spent some time looking around for where you receive input from
      the user, before realising that you weren't doing this, but
      running through a predefined test sequence; again something that
      should have been mentioned. I also take it that all those printfs
      littering your code are debug code to try and get your code
      working - they shouldn't be needed for something like this.

      I _really_ doubt arr should be 161 characters long and your trial
      and error comment does little to inspire confidence. 160 is much
      more likely, quite possibly on a 40x4 matrix. If that's the case
      then what about line breaks - presumably we need to wrap at word
      boundaries which you aren't doing here. I can understand why you
      got 161 - you need one for the trailing NULL character to treat
      the display buffer as a string. Big mistake - it is a character
      array, not a string, and if you start writing to arr[161] that
      may well be some special function register associated with the
      display.

      Looking through your code in a little more detail, a few more
      specific issues do come to mind.

      Don't:
      #include <stdio.h>
      #include "string.h"

      Do:
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>

      [Always use angle brackets for standard libraries]
      [malloc() is defined in <stdlib.h>]

      Don't:
      totlen=strlen(s tringdata)+strl en(stringdata)+ strlen(stringda ta2);

      Do:
      totlen = strlen(stringda ta) + strlen(stringda ta1) + strlen(stringda ta2);

      [Silly mistake: we all make them]

      Don't:
      numpages=totlen/bytesperpage;
      printf("total number of pages is %d\n",numpages) ;
      contentremainin g=(totlen)%(byt esperpage);
      if(contentremai ning 0)
      {
      numpages=numpag es+1;

      }
      printf("total number of pages is %d\n",numpages) ;

      Do:
      numpages = (totlen + (bytesperpage - 1)) / bytesperpage;
      printf("total number of pages is %d\n", numpages);

      [More compact and faster]
      [This is a standard pattern whenever you need to round a division up]
      [Test it with a pen and paper to prove to yourself it works]

      --
      Andrew Smallshaw
      andrews@sdf.lon estar.org

      Comment

      Working...