int command_line_get_unit (const char* prompt, PedUnit* unit) { StrList* opts = NULL; PedUnit walk; char* unit_name; const char* default_unit_name; for (walk = PED_UNIT_FIRST; walk <= PED_UNIT_LAST; walk++) opts = str_list_append (opts, ped_unit_get_name (walk)); default_unit_name = ped_unit_get_name (ped_unit_get_default ()); unit_name = command_line_get_word (prompt, default_unit_name, opts, 1); str_list_destroy (opts); if (unit_name) { *unit = ped_unit_get_by_name (unit_name); free (unit_name); return 1; } else return 0; }
PyObject *py_ped_unit_get_name(PyObject *s, PyObject *args) { const char *name; int unit; if (!PyArg_ParseTuple(args, "i", &unit)) { return NULL; } if (unit < PED_UNIT_FIRST || unit > PED_UNIT_LAST) { PyErr_SetString(PyExc_ValueError, "Invalid unit provided."); return NULL; } /* * DO NOT free the result from ped_unit_get_name(), it's a pointer to * a value in the static unit_names[] array in libparted. */ name = ped_unit_get_name(unit); if (name != NULL) { return PyUnicode_FromString(name); } else { return PyUnicode_FromString(""); } }
/** * \brief Get a string that describes the location of the \p byte on * device \p dev. * * The string is described with the desired \p unit. * The returned string must be freed with free(). */ char* ped_unit_format_custom_byte (const PedDevice* dev, PedSector byte, PedUnit unit) { char buf[100]; PedSector sector = byte / dev->sector_size; double d, w; int p; PED_ASSERT (dev != NULL); /* CHS has a special comma-separated format. */ if (unit == PED_UNIT_CHS) { const PedCHSGeometry *chs = &dev->bios_geom; snprintf (buf, 100, "%lld,%lld,%lld", sector / chs->sectors / chs->heads, (sector / chs->sectors) % chs->heads, sector % chs->sectors); return ped_strdup (buf); } /* Cylinders, sectors and bytes should be rounded down... */ if (unit == PED_UNIT_CYLINDER || unit == PED_UNIT_SECTOR || unit == PED_UNIT_BYTE) { snprintf (buf, 100, "%lld%s", byte / ped_unit_get_size (dev, unit), ped_unit_get_name (unit)); return ped_strdup (buf); } if (unit == PED_UNIT_COMPACT) { if (byte >= 10LL * PED_TERABYTE_SIZE) unit = PED_UNIT_TERABYTE; else if (byte >= 10LL * PED_GIGABYTE_SIZE) unit = PED_UNIT_GIGABYTE; else if (byte >= 10LL * PED_MEGABYTE_SIZE) unit = PED_UNIT_MEGABYTE; else if (byte >= 10LL * PED_KILOBYTE_SIZE) unit = PED_UNIT_KILOBYTE; else unit = PED_UNIT_BYTE; } /* IEEE754 says that 100.5 has to be rounded to 100 (by printf) */ /* but 101.5 has to be rounded to 102... so we multiply by 1+E. */ /* This just divide by 2 the natural IEEE754 extended precision */ /* and won't cause any trouble before 1000 TB */ d = ((double)byte / ped_unit_get_size (dev, unit)) * (1. + DBL_EPSILON); w = d + ( (d < 10. ) ? 0.005 : (d < 100.) ? 0.05 : 0.5 ); p = (w < 10. ) ? 2 : (w < 100.) ? 1 : 0 ; #ifdef __BEOS__ snprintf (buf, 100, "%.*f%s", p, d, ped_unit_get_name(unit)); #else snprintf (buf, 100, "%1$.*2$f%3$s", d, p, ped_unit_get_name (unit)); #endif return ped_strdup (buf); }