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

int main(int argc, char **argv)
{
    int i;
    if (argc<3) {
	printf("usage: %s <string-value> <format-string> <value-type:(i|b|d|f|c)>\n"
	       "Uninitialized variables have value of -777, -7.77, or \"BAAD\"\n",
	       argv[0]);
	return 0;
    }
    for(i=1; i<argc; i+=3) {
	int status;
	char *str = argv[i];
	char *fmt = argv[i+1];
	char *type = argv[i+2];
	int ival;
	char cval;
	double dval;
	float fval;
	char remainder[4092];
	char fmtbuffer[4092];
	sprintf(fmtbuffer, "%s%%s", fmt);
	ival = -777;
	dval = -7.77;
	fval = -7.77;
	strncpy(remainder,"BAAD",4);
	switch (type[0]) {
	case 'i':
	case 'b':
	    status = sscanf(str, fmtbuffer, &ival, &remainder);
	    if (status < 0) {
		perror("Error: sscanf returned 0\n");
	    } else {
		printf("sscanf(\"%s\", \"%s\", &%s, &remainder) -> returned %d, results %s=%d remainder=\"%s\"\n",
		       str, fmtbuffer, type, status, type, ival, remainder);
	    }
	    break;
	case 'f':
	    status = sscanf(str, fmtbuffer, &fval, &remainder);
	    if (status < 0) {
		perror("Error: sscanf returned 0\n");
	    } else {
		printf("sscanf(\"%s\", \"%s\", &%s, &remainder) -> returned %d, results %s=%f remainder=\"%s\"\n",
		       str, fmtbuffer, type, status, type, fval, remainder);
	    }
	    break;
	case 'd':
	case 'l':
	    status = sscanf(str, fmtbuffer, &dval, &remainder);
	    if (status < 0) {
		perror("Error: sscanf returned 0\n");
	    } else {
		printf("sscanf(\"%s\", \"%s\", &%s, &remainder) -> returned %d, results %s=%f remainder=\"%s\"\n",
		       str, fmtbuffer, type, status, type, dval, remainder);
	    }
	    break;
	case 'c':
	    status = sscanf(str, fmtbuffer, &cval, &remainder);
	    if (status < 0) {
		perror("Error: sscanf returned 0\n");
	    } else {
		printf("(%d) %s -> %c \"%s\"\n", status, str, cval, remainder);
	    }
	    break;
	default:
	    printf("Unknown type: %s\n", type);
	    break;
	}
    }
}
