char *ft_itoa_base(int value, int base) { unsigned int n; int size; char *p; char *dest; char *char_base; if (value == 0) return ("0"); char_base = build_base(); size = memory_needed(value, base); n = ((value < 0 ) ? -value : value); if (!(dest = malloc(sizeof(*dest) * (size + 1)))) return (NULL); p = dest + size; *p-- = '\0'; while (n > 0) { *p-- = char_base[n % base]; n /= base; } if (value < 0) *p = '-'; return (dest); }
int main(int argc, char **argv) { struct gdt_desc desc; uint64_t qword; uint32_t base, limit; assert(sizeof(struct gdt_desc) == 8); if (argc != 2) { printf("%s <gdt descriptor>\n", argv[0]); return -1; } // Copy 64-bit value into the descriptor structure. qword = strtoll(argv[1], NULL, 16); memcpy(&desc, &qword, sizeof(struct gdt_desc)); printf("Segment descriptor details\n"); printf("---------------------------\n"); // Detect whether or not the descriptor is 64-bit. if (desc.fl.l) { printf("Mode: Long mode\nType: %s\n", get_descriptor_type(desc.ab.ex)); printf("Base=0, Limit=ffffffffffffffff\n"); if (desc.fl.sz) { printf("Warning: the flag Size should be unset for long mode!\n"); } } else { printf("Mode: %d-bit Protected mode\nType: %s\n", (desc.fl.sz) ? 32 : 16, get_descriptor_type(desc.ab.ex)); base = build_base(desc.base_0_15, desc.base_0_15, desc.base_24_31); limit = build_limit(desc.limit_0_15, desc.limit_16_19); if (desc.fl.gran) { limit = (limit << 12U) + 0xFFF; } printf("Base=%08x, Limit=%08x\n", base, limit); } printf("* Access byte:\n"); dump_access_byte(desc.ab); printf("* Flags:\n"); dump_flags(desc.fl); return 0; }