-       long width;
+       int width;

and then:

-                       width = strtol(argv[pos++], NULL, 10);
+                       width = (int)strtol(argv[pos++], NULL, 10);

This is not right.

You need to leave the type as long, and then range check it.  I understand
you are uncomfortable passing it later in an int context, where it gets
truncated.  But truncating it explicitly like that a cast is even worse.
A huge number should not get bits chopped off and behave strangely, it
should behave like the standard printf operation.

Reply via email to