#include <stdio.h>
#define MODE_PHYSICAL_BOOK 1 /* (1(16bit) + UUID(32bit)) & ISBN(32bit)*/
#define MODE_EBOOK 2 /* 0(32bit) & (1(16bit) + UUID(32bit)) */
#define MODE_AUDIOBOOK 3 /* 0(32bit) & AUDIO BOOK ID(32bit) */
#define ROSE_UUID_ID_MASK(X) (X | 1 << 31)
#define ROSE_PHYSICAL_BOOK_UUID_ID_UNMASK(X) (((X & 0XFFFFFFFF00000000) >> 32) & ~(1 << 31))
#define ROSE_EBOOK_UUID_ID_UNMASK(X) ((X & 0X00000000FFFFFFFF) & ~(1 << 31))
#define ROSE_ISBN_ID_UNMASK(X) (X & 0X00000000FFFFFFFF)
/*
* BOOK ID for ROSE is 64-bit.So masking 32 bit to 64 bit and the BOOK-ID as follows
* PHYSICAL BOOK (32bits(uuid-id) + 32bits (isbn id))
* EBOOK (32bits (0) + 32bits (uuid-id))
* AUDIOBOOK (32bits (0) + 32bits (AUDIO-BOOK id))
*/
#define ROSE_MASK_TO_BOOK_ID(X,Y) (((long long int)X) << 32 | ((long long int)Y))
int main()
{
int mode = 0;
unsigned int uuid_id = 0; /* Max UUID id 65535 */
unsigned int isbn_id = 0; /* Max isbn id 4294967294 */
unsigned int u_isbn_id = 0;
long long int book_id = 0;
unsigned int m_uuid_id = 0; /* Max UUID id 2147549183 */
unsigned int u_uuid_id = 0; /* Max UUID id 65535 */
printf("Enter the reading mode(1/2/3): ");
scanf("%d", &mode);
switch(mode) {
case MODE_PHYSICAL_BOOK:
printf("\nEnter PHYSICAL_BOOK uuid id: ");
scanf("%d", &uuid_id);
printf("\nEnter PHYSICAL_BOOK ISBN id: ");
scanf("%d", &isbn_id);
m_uuid_id = ROSE_UUID_ID_MASK(uuid_id);
book_id = ROSE_MASK_TO_BOOK_ID(m_uuid_id, isbn_id);
printf("\n Masked UUID id %u BOOK id %llu\n", m_uuid_id, book_id);
u_uuid_id = ROSE_PHYSICAL_BOOK_UUID_ID_UNMASK(book_id);
u_isbn_id = ROSE_ISBN_ID_UNMASK(book_id);
printf("\n Unmasked UUID id %u isbn id %u\n", u_uuid_id, u_isbn_id);
break;
case MODE_EBOOK:
printf("\nEnter EBOOK uuid id: ");
scanf("%d", &uuid_id);
m_uuid_id = ROSE_UUID_ID_MASK(uuid_id);
book_id = ROSE_MASK_TO_BOOK_ID(0, m_uuid_id);
printf("\n Masked UUID id %u BOOK id %llu\n", m_uuid_id, book_id);
u_uuid_id = ROSE_EBOOK_UUID_ID_UNMASK(book_id);
printf("\n Unmasked UUID id %u isbn id %u\n", u_uuid_id, u_isbn_id);
break;
case MODE_AUDIOBOOK:
printf("\nEnter the AUDIO-BOOK id: ");
scanf("%d", &isbn_id);
book_id = ROSE_MASK_TO_BOOK_ID(0, isbn_id);
printf("\n Masked BOOK id %llu\n", book_id);
u_isbn_id = ROSE_ISBN_ID_UNMASK(book_id);
printf("\n Unmasked UUID id %u isbn id %u\n", u_uuid_id, u_isbn_id);
break;
default:
printf("\nNot supported reading mode\n");
break;
}
return 0;
}