Raymond Toy pushed to branch issue-120-software-type-in-c at cmucl / cmucl
Commits: a47e8963 by Raymond Toy at 2023-03-13T07:31:19-07:00 Use static buffer to hold results
Instead of dynamically allocating space to the the results for `software-type` and `software-version`, use a static string in each function. Fill the string with desired result and return it.
The Lisp interface needs to be updated not to free the memory now since it's not dynamically allocated.
- - - - - 98ae551c by Raymond Toy at 2023-03-13T07:33:45-07:00 Update pot files.
The location of the docstrings have moved and have changed, so the pot files need to be updated.
- - - - -
4 changed files:
- src/code/misc.lisp - src/i18n/locale/cmucl-linux-os.pot - src/i18n/locale/cmucl.pot - src/lisp/os-common.c
Changes:
===================================== src/code/misc.lisp ===================================== @@ -199,9 +199,7 @@ (alien:extern-alien "os_software_type" (function (alien:* c-call:c-string))))) (unless (zerop (sap-int (alien:alien-sap software-type))) - (alien:cast software-type c-call:c-string))) - (when software-type - (alien:free-alien software-type)))))) + (alien:cast software-type c-call:c-string))))))) *software-type*)
(defvar *software-version* nil @@ -219,9 +217,7 @@ (alien:extern-alien "os_software_version" (function (alien:* c-call:c-string))))) (unless (zerop (sap-int (alien:alien-sap version))) - (alien:cast version c-call:c-string))) - (when version - (alien:free-alien version))))) + (alien:cast version c-call:c-string)))))) *software-version*))
(defvar *short-site-name* (intl:gettext "Unknown")
===================================== src/i18n/locale/cmucl-linux-os.pot ===================================== @@ -15,10 +15,6 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n"
-#: src/code/linux-os.lisp -msgid "Returns a string describing version of the supporting software." -msgstr "" - #: src/code/linux-os.lisp msgid "Unix system call getrusage failed: ~A." msgstr ""
===================================== src/i18n/locale/cmucl.pot ===================================== @@ -5605,14 +5605,14 @@ msgid "" " NIL if no such character exists." msgstr ""
-#: src/code/misc.lisp +#: src/code/misc-doc.lisp src/code/misc.lisp msgid "" "Returns the documentation string of Doc-Type for X, or NIL if\n" " none exists. System doc-types are VARIABLE, FUNCTION, STRUCTURE, TYPE,\n" " SETF, and T." msgstr ""
-#: src/code/misc.lisp +#: src/code/misc-doc.lisp src/code/misc.lisp msgid "~S is not the name of a structure type." msgstr ""
@@ -5643,13 +5643,21 @@ msgid "Returns a string giving the name of the local machine." msgstr ""
#: src/code/misc.lisp -msgid "The value of SOFTWARE-TYPE. Set in FOO-os.lisp." +msgid "The value of SOFTWARE-TYPE." msgstr ""
#: src/code/misc.lisp msgid "Returns a string describing the supporting software." msgstr ""
+#: src/code/misc.lisp +msgid "Version string for supporting software" +msgstr "" + +#: src/code/misc.lisp +msgid "Returns a string describing version of the supporting software." +msgstr "" + #: src/code/misc.lisp msgid "The value of SHORT-SITE-NAME. Set in library:site-init.lisp." msgstr ""
===================================== src/lisp/os-common.c ===================================== @@ -817,43 +817,47 @@ os_get_locale_codeset() #endif
char* -os_software_version() +os_software_version(void) { - int status; struct utsname uts; - char *version = NULL; + /* + * Buffer large enough to hold the release and version that's used + * for Linux and Solaris. + */ + static char result[sizeof(uts.release) + sizeof(uts.version)]; + + int status;
status = uname(&uts); - if (status == 0) { - int version_length; + if (status != 0) { + return NULL; + } + #if defined(UNAME_RELEASE_AND_VERSION) - version_length = strlen(uts.release) + strlen(uts.version) + 2; - version = malloc(version_length); - if (version) { - strcpy(version, uts.release); - strcat(version, " "); - strcat(version, uts.version); - } + strcpy(result, uts.release); + strcat(result, " "); + strcat(result, uts.version); #else - version = strdup(uts.version); + strcpy(result, uts.version); #endif - }
- return version; + return result; } #undef UNAME_RELEASE_AND_VERSION
char* -os_software_type() +os_software_type(void) { int status; struct utsname uts; - char *os_name = NULL; + static char os_name[sizeof(uts.sysname)];
status = uname(&uts); - if (status == 0) { - os_name = strdup(uts.sysname); + if (status != 0) { + return NULL; } + + strcpy(os_name, uts.sysname);
return os_name; }
View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/-/compare/d8f99abf569c7ae830abeb2...