Beispiel #1
0
static int biniku_get(FILE *fi) {
	uint a, p = 0;

	READ(&a, 4);
	if(fseek(fi, a * 4 + 4, SEEK_SET)) return -1;

	for(;;) {
	  LODSB; p++;
	  switch(biniku_code(a)) {

	  case 1:	  // offset
	  case 2:	  // int
	    READ(&a, 4); p += 4;
	    break;
	  case 3:	  // string
	    if(a != 0x0A) break;
	    printf("%05i ", p);
	    for(;;) {
	      LODSB; p++;
	      if(!a) break;
	      text_putc(a);
	    }
	    putchar('\n');
	    break;
	  }
	}
	return 0;
}
Beispiel #2
0
static void promia_str(uint p, uint *l, uint *mc, uchar *ms, uint ns) {
	uint a, i;

	i = mc[p];
	if(!i) return;
	if(i < 0x10 || i >= ns) { printf("# error, str 0x%08X\n", i); return; }
	if(i > *l) printf("# skip 0x%08X\n", *l);

	printf("%06i ", p);
	while(i < ns) {
	  a = ms[i++];
	  if(!a) break;
	  text_putc(a);
	}
	putchar('\n');
	if(!ms[i]) i++;
	if(i > *l) *l = i;
}
Beispiel #3
0
static int kogado_get(FILE *fi) {
	uint a, i, n, t[13];
	READ(t, 0x34);
	if(memcmp(t, "SR01", 4)) return -1;
	if(fseek(fi, t[10], SEEK_SET)) return -1;
	for(i = 0; i < t[12]; i++) {
	  if(fread(&a, 1, 2, fi) != 2) break;
	  n = (ushort)a;
	  if(n < 2) break;
	  n -= 2;
	  printf("%03i ", i);
	  if(n) do {
	    LODSB;
	    if(!a && n < 3) break;
	    text_putc(a);
	  } while(--n);
	  if(n == 2) LODSB;
	  putchar('\n');
	}
	return 0;
}
Beispiel #4
0
/*-----------------------------------------------------------------------------
Name      :  noprocess_and_write
Purpose   :  read data from "fd" and WITHOUT Esc sentence interpretation 
             and convert it (if font_path!=NULL) and put it on stdout
Inputs    :  <>
Outputs   :  <>
Return    :  <>
-----------------------------------------------------------------------------*/
static void noprocess_and_write(void)
{
    int c;
	char * qrbuf;
	int size, idx;

	int ver, level, mode, casesensitivity;

    debug("NOT processing esc sentence.",NULL);
    
    while ((c = utf8_get_code()) >= 0)
    {
        if (cancel_flag)
            break;

		switch (state)
		{
			case PROCESSING_TAG:
				if (c == '.')
				{
					state = QRCODE_READING_VER0;
					qrbuf = malloc((size = 1024) + 1);
					idx = 0;
					if (!qrbuf)
						state = PROCESSING_IDLE;
					break;
				}
				/* fall out */
				state = PROCESSING_IDLE;
				break;
			default:
			case PROCESSING_IDLE:
				if (c == ESC) 
				{
					tag_index = 0;
					state = PROCESSING_TAG;
				}
				else
        if (font_path != NULL) 
            text_putc(c);
        else
						fputc(c,stdout);
				break;
			case QRCODE_READING_VER0:
				ver = level = mode = casesensitivity = 0;
				if ((c = fromascii(c)) == -1)
				{
					state = PROCESSING_IDLE;
					break;
				}
				else
				{
					ver = c * 10;
					state = QRCODE_READING_VER1;
				}
				break;
			case QRCODE_READING_VER1:
				if ((c = fromascii(c)) == -1)
				{
					state = PROCESSING_IDLE;
					break;
				}
				else
				{
					ver += c;
					state = QRCODE_READING_LEVEL;
				}
				break;
			case QRCODE_READING_LEVEL:
				if ((c = fromascii(c)) == -1)
				{
					state = PROCESSING_IDLE;
					break;
				}
				else
				{
					level = c;
					state = QRCODE_READING_MODE;
				}
				break;
			case QRCODE_READING_MODE:
				if ((c = fromascii(c)) == -1)
				{
					state = PROCESSING_IDLE;
					break;
				}
				else
				{
					mode = c;
					state = QRCODE_READING_CASE_SENSITIVITY;
				}
				break;
			case QRCODE_READING_CASE_SENSITIVITY:
				if ((c = fromascii(c)) == -1)
				{
					state = PROCESSING_IDLE;
					break;
				}
				else
				{
					casesensitivity = c;
					state = QRCODE_READING_DATA;
				}
				break;
			case QRCODE_READING_DATA:
				if (c == ESC)
				{
					char * qr_data;
					int qrlen;
					command_t cmd;

					qrbuf[idx] = 0;

					fprintf(stderr,"DEBUG: %s() ver = %i, level = %i, mode = %i, case = %i\n", __func__, ver, level, mode, casesensitivity);


					if (cmd_mrs_qrcode(ver, level, mode, casesensitivity, qrbuf, &qr_data, &qrlen, &cmd) == APS_OK)
					{
						write_command(1, &cmd, qr_data, qrlen);

						fflush(stdout);
						free(qr_data);
					}

					free(qrbuf);

					state = PROCESSING_IDLE;

				}
#if 0
				{
					int i, j, k, x, bcnt, len;
					QRcode *qrcode;
					unsigned char * p, cb;
#if 1
					qrbuf[idx] = 0;
					qrcode = QRcode_encodeString(qrbuf, 0, QR_ECLEVEL_L, QR_MODE_8, 0);
					if (!qrcode)
					{
						state = PROCESSING_IDLE;
						break;
					}

					//p = malloc(len = ((qrcode->width + 7) / 8) * 8);
					len = (qrcode->width + 7) / 8;
					p = malloc(len * qrcode->width);
					memset(p, 0x5a, 10 * len * qrcode->width);

					for (idx = x = i = 0; i < qrcode->width; i ++)
					{
						for (bcnt = cb = j = 0; j < qrcode->width; j ++, x ++)
						{
							cb <<= 1;
							if (qrcode->data[x] & 1)
								cb |= 0x80 >> 7;
							if (++ bcnt == 8)
							{
								p[idx ++] = cb;
								cb = 0;
								bcnt = 0;
							}
						}
						if (bcnt)
						{
							cb <<= 8 - bcnt;
							p[idx ++] = cb;
						}
					}

					command_t cmd;
					cmd.size = 4;
					cmd.buf[0] = GS;
					cmd.buf[1] = 'k';
					cmd.buf[2] = 8;
					cmd.buf[3] = qrcode->width;
#endif
					//write_command(0, &cmd, p, idx);
					write_command(1, &cmd, p, idx);

					fflush(stdout);

					QRcode_free(qrcode);

					free(qrbuf);
					free(p);

					state = PROCESSING_IDLE;

				}
#endif
				else
				{
					if (idx == size)
        {
						qrbuf = realloc(qrbuf, (size *= 2) + 1);
						if (!qrbuf)
						{
							state = PROCESSING_IDLE;
							break;
						}
        }
					qrbuf[idx ++] = c;
    }

				break;

		}
	}
Beispiel #5
0
/*-----------------------------------------------------------------------------
Name      :  process_and_write
Purpose   :  read data from "fd" and WITH Esc sentence interpretation 
             and convert it (if font_path!=NULL) and put it on stdout
Inputs    :  <>
Outputs   :  <>
Return    :  <>
-----------------------------------------------------------------------------*/
static void process_and_write(void)
{
    int c;

    debug("Processing esc sentence.",NULL);
    
    while ((c = utf8_get_code()) >= 0)
    {
        if (cancel_flag)
            break;

        switch (state) {
            case PROCESSING_IDLE:
                if (c == '<') 
                {
                    tag_index = 0;
                    state = PROCESSING_TAG;
                }
                else
                    if (font_path != NULL) 
                        text_putc(c);
                    else
                        fputc(c,stdout);
                break;

			default:
            case PROCESSING_TAG:
                if (c=='>') {
                    int n;

                    tag_buf[tag_index] = 0;
                    n = tag_to_char();

                    if (n==-1)
                        printf("<%s>",tag_buf);
                    else
                        fputc(n,stdout);

                    state = PROCESSING_IDLE;
                }
                else if (c=='<') {
                    /*reset tag index in case of '<<LF>'*/
                    fputc('<',stdout);
                    tag_index = 0;
                }
                else {
                    if (tag_index==TAG_BUFSIZE) {
                        tag_buf[tag_index] = 0;
                        printf("<%s",tag_buf);

                        state = PROCESSING_IDLE;
                    }
                    else {
                        tag_buf[tag_index] = c;
                        tag_index++;
                    }
                }
                break;
        }
    }
}