Tagged: va_list Toggle Comment Threads | Keyboard Shortcuts

  • Ali BaderEddin 6:35 pm on March 27, 2010 Permalink | Reply
    Tags: avg, INT_MIN, max, maximum, min, minimum, standard deviation, stdev, sum, var, variance, va_arg, , va_list,   

    SQL Aggregates in C 


    For fun, I would like to implement some of the SQL aggregates in C: SUM (sum), AVG (average), MIN (minimum), MAX (maximum), STDEV (standard deviation), VAR (variance).

    To do this in C, I’ll use functions with variable number of arguments instead of a function with an array and a count of the elements in that array. To do this, I need to have a special value for the last parameter in the variable list of arguments to know when to stop getting arguments in the list. For that, I’m going to use the INT_MIN macro in the <climits> C library. For example, to get the average of the numbers 6, 3, and 19, the call would look like AVG(6, 3, 19, INT_MIN).

    SUM

    Implementing this in C is lame, but I’ll use it as the starting point before getting to the other functions. I would definitely prefer to write 1 + 2 + 3 in C instead of SUM(1, 2, 3, INT_MIN).

    Definition

    int sum (int first, ...)
    {
        register int i = first;
        int sum = 0;
       
        //  declare a variable argument list
        va_list arg_list;
       
        //  initialize the arglist
        va_start (arg_list, first);
       
        //  Sum all arguments
        while(i != INT_MIN)
        {
            sum += i;
            i = va_arg (arg_list, int);
        }
       
        //  End the argument list
        va_end(arg_list);
       
        return sum;
    }

    Usage

    printf ("Sum of (1, 2, 3, 4, 5) = %d\n", sum (1, 2, 3 , 4, 5, INT_MIN));

    Output

    15

    AVG

    Instead of writing something like (1+2+3+4)/4 or (4 + 3 + 6 + 1 + 5 + 11 + 19 + 25 + 111 + 55 + 32 + 57)/ 12, I’d rather write AVG(1, 2, 3, 4, INT_MIN) or AVG(4, 3, 6, 1, 5, 11, 19, 25, 111, 55 , 32, 57, INT_MIN) without having to count the number of numbers I’m calculating the average for.

    Definition

    double avg (int first, ...)
    {
        register int i = first;
        int sum = 0, count = 0;
       
        va_list arg_list;
        va_start (arg_list, first);
       
        //  sum and count all arguments
        while(i != INT_MIN)
        {
            sum += i;
            count++;
            i = va_arg (arg_list, int);
        }
       
        va_end(arg_list);
       
        return (double) sum / count;
    }

    Usage

    printf ("Average of (1, 2, 3, 4, 5) = %.2f\n", avg (1, 2, 3 , 4, 5, INT_MIN));

    Output

    3.00

    MIN

    Instead of implementing MIN by passing an array and the count of numbers in that array , I’d rather just pass all the numbers to the function without having to worry about creating an array and counting the number of elements inside it.

    Definition

    int min (int first, ...)
    {
        register int i = first;
        int min = first;
       
        va_list arg_list;
        va_start(arg_list, first);
       
        //  Search for any other argument that is less than the first
        //  If you find one, then assign it to min
        while(i != INT_MIN)
        {
            if(i < min)
                min = i;
    
            i = va_arg(arg_list, int);
        }
       
        va_end(arg_list);
       
        return min;
    }

    Usage

    printf ("Minimum of (10, 23, 3, 41, 15) = %d\n", min (10, 23, 3, 41, 15, INT_MIN));

    Output

    3

    MAX

    Gets the maximum number in a set.

    Definition

    int max (int first, ...)
    {
        register int i = first;
        int max = first;
       
        va_list arg_list;
        va_start(arg_list, first);
       
        //  Search for any other argument that is greater than the first
        //  If you find one, then assign it to max
        while(i != INT_MIN)
        {
            if(i > max)
                max = i;
    
            i = va_arg(arg_list, int);
        }
       
        va_end(arg_list);
       
        return max;
    }

    Usage

    printf ("Maximum of (10, 23, 3, 41, 15) = %d\n", max (10, 23, 3, 41, 15, INT_MIN));

    Output

    41

    STDEV

    Calculates the standard deviation for a set of numbers.

    Definition

    double stdev (int first, ...)
    {
        register int i = first;
        int count = 0;
        int sum = 0;
        double mean = 0;
        double deviation = 0;
        va_list arg_list;
    
        //  Calculate the mean (average)
        va_start(arg_list, first);
       
        while(i != INT_MIN)
        {
            sum += i;
            count++;
            i = va_arg (arg_list, int);
        }
       
        va_end(arg_list);
        mean = (float) sum / count;
    
        //  Calculate the standard deviation
        i = first;
        va_start(arg_list, first);
       
        while(i != INT_MIN)
        {
            deviation += pow((i - mean), 2);
            i = va_arg (arg_list, int);
        }
    
        deviation /= count;
        deviation = sqrt(deviation);
    
        va_end(arg_list);
       
        return deviation;
    }

    Usage

    printf ("Standard Deviation of (2, 4, 4, 4, 5, 5, 7, 9) = %.2f\n", stdev (2, 4, 4, 4, 5, 5, 7, 9, INT_MIN));

    Output

    2.00

    VAR

    Calculates the variance for a set of numbers.

    Definition

    double var (int first, ...)
    {
        register int i = first;
        int count = 0;
        int sum = 0;
        double mean = 0;
        double variance = 0;
        va_list arg_list;
    
        //  Calculate the mean (average)
        va_start(arg_list, first);
       
        while(i != INT_MIN)
        {
            sum += i;
            count++;
            i = va_arg (arg_list, int);
        }
       
        va_end(arg_list);
        mean = (float) sum / count;
    
        //  Calculate the variance
        i = first;
        va_start(arg_list, first);
       
        while(i != INT_MIN)
        {
            variance += pow((i - mean), 2);
            i = va_arg (arg_list, int);
        }
    
        variance /= (count - 1);
    
        va_end(arg_list);
       
        return variance;
    }

    Usage

    printf ("Variance of (1, 2, 3, 4, 5, 6) = %.2f\n", var (1, 2, 3, 4, 5, 6, INT_MIN));

    Output

    3.50


    Full source code is available here.

     
  • Ali BaderEddin 12:05 am on March 23, 2010 Permalink | Reply
    Tags: glRasterPos, glutBitmapCharacter, GLUT_BITMAP_HELVETICA, GLUT_BITMAP_TIMES_ROMAN, OpenGL string, OpenGL Text, printw, , va_list, , vsprintf_s, _vscprintf   

    OpenGL String (printw) 


    There are many ways for displaying text in OpenGL. In this post, I’ll use the glutBitmapCharacter function to draw characters, and then will extend it to a more generic function (printw), which will make drawing a string in OpenGL as simple as using printf.

    First, I will start by defining the font to be used by the glutBitmapCharacter function. I will choose a 24-point proportional spaced Times Roman font as shown below:

    //  A pointer to a font style..
    //  Fonts supported by GLUT are: GLUT_BITMAP_8_BY_13,
    //  GLUT_BITMAP_9_BY_15, GLUT_BITMAP_TIMES_ROMAN_10,
    //  GLUT_BITMAP_TIMES_ROMAN_24, GLUT_BITMAP_HELVETICA_10,
    //  GLUT_BITMAP_HELVETICA_12, and GLUT_BITMAP_HELVETICA_18.
    GLvoid *font_style = GLUT_BITMAP_TIMES_ROMAN_24;

    To draw a character, simply define the raster position using glRasterPos3f (x, y, z), then draw it using glutBitmapCharacter(font_style, character). To extend this to drawing a string at certain coordinates, loop over each character in the string and draw it with glutBitmapCharacter. The additional logic that goes below is in making this as pretty as printf.

    This can be done by using C’s va_list type, which is C’s approach to defining functions with variables number of arguments.

    • In the function prototype, place ellipsis (…) as the last argument
    • Define a variable argument list: va_list args;
    • Call va_start on the args list and the first real argument in the function prototype preceding the ellipsis: va_start(args, format);
    • Use _vscprintf to get the number of characters that would be generated if the string pointed to by the list of arguments was printed using the specified format
    • Allocate memory for a string with the specified number of characters
    • Call vsprintf_s to build the string we want from the list of arguments
    • Call va_end to end the use of the variables argument list
    • Draw our beautified string
    • Free allocated memory

    Function implementation with full comments shown below:

    //-------------------------------------------------------------------------
    //  Draws a string at the specified coordinates.
    //-------------------------------------------------------------------------
    void printw (float x, float y, float z, char* format, ...)
    {
        va_list args;   //  Variable argument list
        int len;        // String length
        int i;          //  Iterator
        char * text;    // Text
    
        //  Initialize a variable argument list
        va_start(args, format);
    
        //  Return the number of characters in the string referenced the list of arguments.
        // _vscprintf doesn't count terminating '\0' (that's why +1)
        len = _vscprintf(format, args) + 1;
    
        //  Allocate memory for a string of the specified size
        text = malloc(len * sizeof(char));
    
        //  Write formatted output using a pointer to the list of arguments
        vsprintf_s(text, len, format, args);
    
        //  End using variable argument list
        va_end(args);
    
        //  Specify the raster position for pixel operations.
        glRasterPos3f (x, y, z);
    
        //  Draw the characters one by one
        for (i = 0; text[i] != '\0'; i++)
        glutBitmapCharacter(font_style, text[i]);
    
        //  Free the allocated memory for the string
        free(text);
    }

    Now that printw is defined, using it is similar to printf:

    printf(         "char: %c, decimal: %d, float: %f, string: %s", 'X', 1618, 1.618, "text");
    printw(x, y, z, "char: %c, decimal: %d, float: %f, string: %s", 'X', 1618, 1.618, "text");

    Libraries to include before copying the function ;)

    #include <stdio.h>    //  Standard Input\Output C Library
    #include <stdarg.h>   //  To use functions with variables arguments
    #include <stdlib.h>   //  for malloc
    #include <gl/glut.h>  //  Include GLUT, OpenGL, and GLU libraries

    Here is a sample source code that contains the printw function. If you have any issues compiling or running the app, check out this section for details about compiling and running an OpenGL app that uses the GLUT library. Below is a screen shot of the demo app:

     
    • Vitalie 9:59 pm on September 17, 2010 Permalink | Reply

      Hi, im getting a simple error when compiling, this even happens when i use the link to the ‘many ways’

      There is a

      error C3861: ‘printw': identifier not found

      It does not say what identifier, and i have no idea what its talking about, all identifiers are there. Im compiling with Visual Studio 2010, any ideas?

    • Ali BaderEddin 11:08 pm on September 17, 2010 Permalink | Reply

      Can you share your code? Is the file extension .c or .cpp? Make sure the printw function is defined before you call it (i.e. placed in source file before its called).

    • Anajrob 12:05 pm on January 24, 2011 Permalink | Reply

      Hello, I am getting an error in Visual Studio on

      // Allocate memory for a string of the specified size
      text = malloc(len * sizeof(char));

      It says that a value of type “void*” cannot be assigned to an entity of type “char*”.

      • axy 8:42 am on March 28, 2011 Permalink | Reply

        use
        text = (char*) malloc(len * sizeof(char));

    • Jalal 9:51 am on July 28, 2011 Permalink | Reply

      Thanks

    • Cecil 2:29 pm on November 24, 2011 Permalink | Reply

      Easiest way I’ve seen how to do simple text for my scene using keyboard controls to move throughout it.

      -Computer Graphics Student

    • em 9:59 am on January 4, 2012 Permalink | Reply

      How did you make the color of the text white?

      • Zatoichi 8:00 pm on June 16, 2013 Permalink | Reply

        glcolor3f(1,1,1) ;; is white color and you can set the values as you want.

    • Sharaf 12:51 pm on February 28, 2013 Permalink | Reply

      Thanks for sharing this function, I’m facing little problem, I can’t find drawn text :D
      Is that because you are using center of the window as origin, and i’m using top left ?

    • bird12358 11:56 am on December 11, 2013 Permalink | Reply

      Hello,

      I would like to use the printw function. In my program I display a image thanks to glDrawPixels function. I try to display text with printw function but it seems that the images is troncate and is not display fully.

      How can I do this?

      Best regard

    • make your computer a jukebox 3:26 pm on August 22, 2014 Permalink | Reply

      You really make it seem so easy with your presentation but I find this topic to be actually
      something that I think I would never understand.
      It seems too complex and very broad for me. I am looking forward for your next post, I will try to get the hang of
      it!

    • psn guthaben aufladen 3:20 am on September 6, 2014 Permalink | Reply

      May I simply just say what a relief to find someone that actually knows
      what they’re discussing on the web. You certainly realize how
      to bring a problem to light and make it important. More people must look at this
      and understand this side of the story. I can’t believe you aren’t
      more popular given that you certainly possess the gift.

    • diseño páginas web 9:40 am on September 6, 2014 Permalink | Reply

      Great post. I was checking continuously this blog and I am impressed!

      Very useful information particularly the last part :
      ) I care for such information much. I was looking
      for this particular info for a very long time.
      Thank you and good luck.

    • www.postel-poschodova.sk 11:31 am on September 8, 2014 Permalink | Reply

      Som chdel vám poďakovať za to dobrý čítať !!
      Aj určite úplne užil bitu je. Mám ste uložiť ako obľúbené vyskúšať veci,
      ktoré pošty …

    • rangsu.edu.vn 9:49 pm on September 9, 2014 Permalink | Reply

      This page certainly has all of the information and
      facts I wanted about this subject and didn’t know who to ask.

    • creek nation 9:35 am on September 11, 2014 Permalink | Reply

      It’s a shame you don’t have a donate button! I’d without a doubt donate to this outstanding blog!

      I suppose for now i’ll settle for bookmarking and adding your
      RSS feed to my Google account. I look forward to brand new updates and will talk about this blog with my
      Facebook group. Chat soon!

    • sized castle 12:55 am on September 12, 2014 Permalink | Reply

      Hey I know this is off topic but I was wondering if you
      knew of any widgets I could add to my blog that automatically tweet my newest twitter
      updates. I’ve been looking for a plug-in like this for
      quite some time and was hoping maybe you would have some
      experience with something like this. Please let me
      know if you run into anything. I truly enjoy reading
      your blog and I look forward to your new updates.

    • plus.google.com 12:22 pm on September 20, 2014 Permalink | Reply

      Ask for sedan rate instead of stretch limos they are pretty nice and comfortable.

      If there was an alternative which surpasses the volume of
      this pool there would be no chic. If so, you’ll want to choose a limo
      service with a great reputation for reliability and dependability.

    • psychic medium online chat 11:49 am on September 22, 2014 Permalink | Reply

      I don’t know if it’s just me or iif everybody else experiencing problems with your site.
      It appears as though some of the text within your content are running
      off the screen. Can somebody else please comment and let me know if
      this is happoening to them as well? This might be a issue with my browser because I’ve had
      this happen previously. Appreciate it

    • Violette 6:18 pm on September 22, 2014 Permalink | Reply

      This is the right web site for anyone who wants to understand this topic.
      You understand so much its almost tough to argue with you
      (not that I actually will need to…HaHa). You certainly put a brand new spin on a
      subject that has been discussed for years. Wonderful stuff, just
      great!

    • bordeaux 2:11 pm on September 23, 2014 Permalink | Reply

      Hurrah, that’s what I was searching for, what a stuff!
      present here at this web site, thanks admin of this web page.

    • .U8i6E-OSxTR 3:10 pm on September 24, 2014 Permalink | Reply

      I wwas recommended this web site by means of my cousin. I’m not
      certain wheether tthis put up is written via him as no one
      else recognize such specific approximately my trouble.

      You’re incredible! Thanks!

    • página web 9:32 pm on September 24, 2014 Permalink | Reply

      Hello! I just wanted to ask if you ever have any issues with
      hackers? My last blog (wordpress) was hacked and I ended up losing a
      few months of hard work due to no back up. Do you have any solutions to stop hackers?

    • rocks 2:49 am on September 25, 2014 Permalink | Reply

      Having read this I thought it was very informative. I appreciate you
      taking the time and effort to puut this informative article together.
      I once again find myself personally spending a lot of time both reading and posting comments.

      But so what,it was still worthwhile!

    • relationship 4:40 am on September 25, 2014 Permalink | Reply

      Thanks for sharing your thoughts on dreamers.
      Regards

    • Claire 10:49 pm on September 25, 2014 Permalink | Reply

      Either way, the slump was rectified and both parties
      were happy. ” This was a 20 something young lad who was having fun doing something that he loves. Prior to the Algeria match, they beat Qatar, New Zealand and Russia in successie games, in the qualifiers.

    • Pureberry Max 7:32 am on September 29, 2014 Permalink | Reply

      It’s fantastic that you are getting ideas
      from this piece of writing as well as from our argument
      made at this time.

    • howtogetyourexgirlfriendback.waterdamagepros.org 8:48 pm on September 29, 2014 Permalink | Reply

      Do you have a spam problem on this website; I also am a blogger, and I
      was wondering your situation; any of us have created some nice
      medthods and we are looking to trade methods with others, why not shoot me aan e-mail if interested.

    • double jogging stroller reviews 2014 3:32 pm on September 30, 2014 Permalink | Reply

      This double stroller is twenty-nine inches wide and will fit
      easily through most entrances and hallways.

    • Corazon 2:55 am on October 1, 2014 Permalink | Reply

      Heya this is kind of of off topic but I was wanting to
      know if blogs use WYSIWYG editors or if you have
      to manually code with HTML. I’m starting a blog
      soon but have no coding experience so I wanted to get guidance from someone with experience.

      Any help would be greatly appreciated!

    • Http://facebook.com/ 2:53 pm on October 1, 2014 Permalink | Reply

      Hi! I could have sworn I’ve been to this website before but after checking through
      some of the post I realized it’s new to me. Nonetheless, I’m definitely happy I
      found it and I’ll be bookmarking and checking back often!

    • Meinl Headliner Cajon 4:34 pm on October 1, 2014 Permalink | Reply

      Hello there, I do believe your web site could be having internet browser compatibility problems.
      Whenever I look at your blog in Safari, it looos fine
      however, when opening in IE, it’s got some overlapping issues.
      I simply wanted to provide youu with a quick heads up! Besides that,
      great site!

    • Roman 12:41 am on October 2, 2014 Permalink | Reply

      I am truly thankful to the owner oof tyis site who has shared this wonderful paragraph at at this time.

    • irobot roomba 880 price Kuala Lumpur 1:50 pm on October 2, 2014 Permalink | Reply

      I love reading an artiicle that will make people think. Also, thank you for allowing me to
      comment!

    • life force energy 8:28 pm on October 2, 2014 Permalink | Reply

      If some one needs expert view about running a blog after that
      i propose him/her to pay a quick visit this webpage, Keep up the pleasant work.

    • wordpress.com 9:41 pm on October 2, 2014 Permalink | Reply

      This is my first time visit at here and i amm truly happy to read everthing at
      single place.

    • Jenna 1:19 pm on October 3, 2014 Permalink | Reply

      Having read this I thought it was very informative. I appreciate you spending
      some time and energy to put this content together. I once again find myself spending way
      too much time both reading and leaving comments. But so what,
      it was still worth it!

    • Flawless Elite 5:28 pm on October 3, 2014 Permalink | Reply

      Tremendous things here. I’m very glad to see your article.
      Thanks a lot and I’m having a look ahead to contact you. Will you kindly drop me a e-mail?

    • lipitor claims 8:11 pm on October 3, 2014 Permalink | Reply

      Thanks for the auspicious writeup. It in fact was once a amusement account it.
      Look advanced to more delivered agreeable from you!
      By the way, how can we keep up a correspondence?

    • cheats for the sims freeplay on iphone 10:02 pm on October 3, 2014 Permalink | Reply

      Can I simply say what a comfort to uncover an individual who
      truly understands what they’re discussing over the internet.

      You certainly realize how to bring a problem to light and make it important.

      More people have to check this out and understand
      this side of the story. It’s surprising you
      aren’t more popular since you most certainly have the gift.

    • battery chainsaw sharpener 4:58 am on October 4, 2014 Permalink | Reply

      Vacation Contest and Sweeps obtained a RYOBI Chainsaw to evaluation and preserve.
      RYOBI will probably be liable for the awarding and shipping of the prize.

    • play store music free of charge 12:10 pm on October 4, 2014 Permalink | Reply

      Actor and singer Patrick Bruel ended up being considered one of France’s biggest stars in the ’90s, first making his or her
      name like a teen idol and leading a return to traditional French chanson inside the
      new millennium. Bruel was born Patrick Benguigui within Tlemcen, Algeria, on May 14, 1959.

      His father abandoned the household when Patrick was only a year old, and
      in 1962, after Algeria won its independence, his mummy moved to France, deciding in the Paris suburb
      associated with Argenteuil. A good soccer player in his youth, Patrick
      first chosen the idea of as being a artist having seen Michel Sardou perform in 1975.

      As luck may have it, acting would deliver him his first achievements; first-time director Alexandre Arcady ran an advert seeking a fresh man using a French-Algerian (or
      “pied-noir” in This particular language slang) accent for
      his motion picture Le Coup hun Sirocco. Benguigui (as he was still
      called) responded and acquired the business. The next year, he spent a in Ny,
      where he met Gérard Presgurvic, later for being his most important songwriter.

      Source: http://yugiohgames.net/index.php?task=profile&id=720769

    • Webcams Amatrices 1:00 pm on October 4, 2014 Permalink | Reply

      Thanks a bunch for sharing this with all people you really understand
      what you’re speaking about! Bookmarked. Kindly additionally discuss
      with my web site =). We will have a hyperlink trade arrangement among us

    • http://download-pictures.com/arnold.htm 9:08 am on October 5, 2014 Permalink | Reply

      Good day! I know this is kind of off topic but I was wondering iff
      you knew where I could locate a captcha plugin for my comment
      form? I’m using the same blog platform as yours and I’m haqving difficulty finding one?
      Thanks a lot!

    • .U9xhE-N_vJI 2:20 pm on October 6, 2014 Permalink | Reply

      It’s actually a great and helpful piece of information. I’m happy that you
      just shared this useful information with us.
      Please kwep us inforked like this. Than you for sharing.

    • www.newways.be 2:54 pm on October 6, 2014 Permalink | Reply

      It’s enormous that you are getting thoughts from this article as well as from
      our discussion made at this time.

    • Yasmin 2:44 pm on October 7, 2014 Permalink | Reply

      I was extremely pleased to find this web site.
      I need to to thank you for ones time for this particularly wonderful
      read!! I definitely liked every bit of it and i also have you bookmarked
      to check out new information on your blog.

    • ignoraras 2:48 pm on October 7, 2014 Permalink | Reply

      En cuanto a sus opciones, WhatsApp Messenger deja envío de fotografías,
      archivos de audio y vídeos.

    • girls in yoga shorts 3:04 pm on October 7, 2014 Permalink | Reply

      Deciding upon a positively coloured yoga pants on girls active wear situations.
      Hyde reports that it is something about making the spine
      supple are the best of University Shopping? Investors accused Lululemon of knowingly
      making disclosures, that caused its share price to be social.
      45, or $371. Here, then going back to pick. Manufacturers such as cotton. Settle in, are moving to
      the ‘athleisure’ trend. Wearing womens yoga pants ripping and unwanted happenings throughout your Yoga class.

    • wizard 101 cheats for crowns 3:41 pm on October 7, 2014 Permalink | Reply

      The other day, while I was at work, my sister
      stole my iPad and tested to see if it can survive
      a 30 foot drop, just so she can be a youtube sensation. My apple ipad is now destroyed and she has 83 views.
      I know this is totally off topic but I had to share it with someone!

    • Shani 3:33 am on October 8, 2014 Permalink | Reply

      To sprawia

    • hale magazynowe produkcja 7:45 am on October 8, 2014 Permalink | Reply

      And if you were building a 16 by 25 building, then the assessment needs walk-in to match that.

      This is the first of a series of contrasts
      between WEIRD folks and whatever the contrast group is, but
      closes with a set of blocks thuat are allocated to
      one bucket.

    • licensed electrician salary toronto 10:10 am on October 8, 2014 Permalink | Reply

      Hello, everything is going well here and ofcourse every one is sharing data, that’s really good, keep up writing.

    • breast actives 10:30 pm on October 8, 2014 Permalink | Reply

      These methods are called as the natural methods
      of breast enhancement. Be sure you request feedback
      so you know if they were pleased with the
      service. The herbal treatments will give you results but you shouldn’t
      expect to have results immediately.

    • Jonelle 8:57 am on October 11, 2014 Permalink | Reply

      great issues altogether, you simply gained a brand new reader.

      What could you suggest about your put up that youu just mwde somke days in the past?
      Any certain?

    • tesco discount codes 6:08 pm on October 18, 2014 Permalink | Reply

      Remarkable issues here. I’m very happy to see your post.

      Thanks a lot andd I’m looking forward to touch you. Willl you kindly drop me
      a e-mail?

    • mini warriors energy hack 10:32 pm on October 20, 2014 Permalink | Reply

      you’re actually a just right webmaster. The web site loading speed
      is incredible. It seems that you’re doing any distinctive trick.

      Furthermore, The contents are masterpiece. you have performed a great
      task in this topic!

c
Compose new post
j
Next post/Next comment
k
Previous post/Previous comment
r
Reply
e
Edit
o
Show/Hide comments
t
Go to top
l
Go to login
h
Show/Hide help
shift + esc
Cancel
Follow

Get every new post delivered to your Inbox.

%d bloggers like this: