Skip to content

Instantly share code, notes, and snippets.

@ilansmith
Created August 19, 2017 22:13
Show Gist options
  • Save ilansmith/8868dc023d3c6369ce4bdc4620331f38 to your computer and use it in GitHub Desktop.
Save ilansmith/8868dc023d3c6369ce4bdc4620331f38 to your computer and use it in GitHub Desktop.
Print "moving" objects (advancing timeline, rotating star, etc...)
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/select.h>
#include <stdarg.h>
#define CURSOR_DISSABLE "\E[?25l"
#define CURSOR_ENABLE "\E[?25h"
#define ARRAY_SZ(ARR) (sizeof(ARR) / sizeof(ARR[0]))
static void print(char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(stdout, fmt, ap);
va_end(ap);
fflush(stdout);
}
void print_sand_clock(int len)
{
int i;
char fmt[16];
sprintf(fmt, "[%%%ds]\r[", len);
print(fmt, "");
for (i = 0; i < len; i++)
{
print(".");
usleep(250000);
}
print("\n");
}
void print_star(int time)
{
char *star[4] = {"-", "\\", "|", "/"};
char fmt[16];
int i;
sprintf(fmt, "%%s\r");
for (i = 0; i < time; i++)
{
print(fmt, star[i%ARRAY_SZ(star)]);
usleep(100000);
}
sprintf(fmt, "%%s\r");
print(fmt, "");
}
void print_movment_single_line(int len)
{
int i;
char fmt[50];
for (i = 0; i < len; i++)
{
sprintf(fmt, "[%%%ds.%%%ds]\r", i, len - 1 - i);
print(fmt, "", "");
usleep(250000);
}
sprintf(fmt, "[%%%ds]\r\n", len);
print(fmt, "");
}
void print_movment_multi_line(int len)
{
#define UP_ONE "\033[2A"
int i;
char fmt[50];
print("\n\n");
for (i = 0; i < len; i++)
{
sprintf(fmt, "%s\r[%%%ds.%%%ds]\n[%%%ds.%%%ds]\n", UP_ONE, i,
len - 1 - i, len - 1 - i, i);
print(fmt, "", "", "", "");
usleep(250000);
}
sprintf(fmt, "%s\r[%%%ds]\n[%%%ds]\n", UP_ONE, len, len);
print(fmt, "", "");
}
int main(int argc, char *argv[])
{
printf(CURSOR_DISSABLE);
print_sand_clock(10);
print_movment_single_line(10);
print_movment_multi_line(10);
print_star(20);
printf(CURSOR_ENABLE);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment