Ingen beskrivning
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

util.c 726B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. #include <stdint.h>
  2. #ifdef DEBUG
  3. #include <stdio.h>
  4. #endif
  5. void* align_after(void* address, int align) {
  6. uintptr_t addr = (uintptr_t) address;
  7. uintptr_t offset = addr % align;
  8. void *rv;
  9. if (offset == 0) {
  10. rv = address;
  11. } else {
  12. rv = (void*) (addr + align - align % offset);
  13. }
  14. #ifdef DEBUG
  15. printf("aligning %p at alignment %x to %p\n", address, align, rv);
  16. #endif
  17. return rv;
  18. }
  19. uintptr_t gcd(uintptr_t a, uintptr_t b) {
  20. if (b > a) {
  21. return gcd(b, a);
  22. }
  23. if (b == 0) {
  24. return a;
  25. }
  26. return gcd(b, a % b);
  27. }
  28. uintptr_t lcm(uintptr_t a, uintptr_t b) {
  29. uintptr_t lcm = (a / gcd(a, b)) * b;
  30. #ifdef DEBUG
  31. printf("so apparently lcm(%lu, %lu) = %lu\n", a, b, lcm);
  32. #endif
  33. return lcm;
  34. }