+1
On a minor nit/suggestion, wouldn't it be simpler to just add the
functions to the existing ddi_strtol page. (I noticed ddi_strtoul is a
separate page as well. It seems kind of wasteful though, since mainly
these functions only differ in a relatively small detail.)
-- Garrett
Gerald Jelinek wrote:
> I am sponsoring this case for Jordan Vaughan.
>
> Thanks,
> Jerry
>
> Template Version: @(#)sac_nextcase %I% %G% SMI
> This information is Copyright 2008 Sun Microsystems
> 1. Introduction
> 1.1. Project/Component Working Name:
> Cross-Platform DDI Interface for Converting Strings to 64-bit Integers
> 1.2. Name of Document Author/Supplier:
> Author: Jordan Vaughan
> 1.3 Date of This Document:
> 01 December, 2008
> 4. Technical Description
> Template Version: @(#)sac_nextcase %I% %G% SMI
> This information is Copyright 2008 Sun Microsystems
> 1. Introduction
> 1.1. Project/Component Working Name:
> Cross-Platform DDI Interface for Converting Strings to 64-bit Integers
> 1.2. Name of Document Author/Supplier:
> Author: Jordan Vaughan
> 1.3 Date of This Document:
> 20 November, 2008
>
> 4. Technical Description
> Targeting an update release of Solaris 10, therefore patch binding.
>
>
> PROBLEM:
>
> Device driver writers have no standard means of converting numerical strings
> to
> 64-bit integers in both 32- and 64-bit builds. Driver writers could use
> ddi_strtol(9F) and ddi_strtoul(9F), but both produce 32-bit integers in 32-bit
> driver builds. Therefore, driver writers must resort to writing their own
> string conversion subroutines or linking to project- or consolidation-private
> string conversion functions, such as the undocumented function idm_strtoull().
> However, these solutions are cumbersome, increase the probability of
> generating
> bugs, and create dependencies on uncommitted, undocumented kernel functions.
> This case proposes to rectify this deficiency by adding two new, committed
> functions to the Solaris 10 and Solaris Nevada (and thus OpenSolaris) DDI
> called
> ddi_strtoll() and ddi_strtoull() that will convert null-terminated character
> strings into signed and unsigned 64-bit integers (respectively) in both 32-
> and
> 64-bit builds.
>
>
> EXPORTED INTERFACES:
>
> FUNCTIONS:
> NAME STABILITY NOTES
> ddi_strtoll Committed In <sys/sunddi.h> under _KERNEL
> ddi_strtoull Committed In <sys/sunddi.h> under _KERNEL
>
>
> TECHNICAL DESCRIPTION:
>
> The Solaris DDI currently provides two string-to-long-integer functions that
> both kernel and driver coders can utilize: ddi_strtol(9F) and ddi_strtoul(9F).
> Both functions convert strings to 32-bit integers in 32-bit builds and 64-bit
> integers in 64-bit builds.
>
> It would be preferable to provide additional functions that would convert
> strings to 64-bit integers in both 32- and 64-bit builds. These functions,
> ddi_strtoll() and ddi_strtoull(), would be functionally equivalent to
> ddi_strtol() and ddi_strtoul() with the exception that the generated values
> would be of types 'longlong_t' and 'u_longlong_t' (respectively) instead of
> 'long int' and 'unsigned long int'.
>
> Given that kernel functions cannot safely utilize errno, both ddi_strtoll()
> and ddi_strtoull() will differ from their userland equivalents (strtoll(3C)
> and
> strtoull(3C)) in that the former will store their results in pointer arguments
> and return error codes (whereas the latter return their results and store
> error codes in errno). This behavior is identical to that of ddi_strtol()
> and ddi_strtoul().
>
>
> RELATED BUGIDS:
>
> 6761505 RFE: having ddi_strtoull() would be nice
>
>
> RELATED ARC CASES:
>
> PSARC/2004/321: Add strtol() and strtoul() to the DDI
>
>
> REFERENCE DOCUMENTS:
>
> ddi_strtol(9F) and ddi_strtoul(9F) man pages
> Solaris Books: Writing Device Drivers (Solaris 10)
> (http://docs.sun.com/app/docs/doc/816-4854)
>
>
> NEW MAN PAGES:
>
> Kernel Functions for Drivers ddi_strtoll(9F)
>
>
>
> NAME
> ddi_strtoll - String conversion functions
>
> SYNOPSIS
> #include <sys/ddi.h>
> #include <sys/sunddi.h>
>
> int ddi_strtoll(const char *str, char **endptr, int base,
> longlong_t *result);
>
>
> INTERFACE LEVEL
> Solaris DDI specific (Solaris DDI)
>
> PARAMETERS
> str Pointer to a character string to be converted.
>
>
> endptr Post-conversion final string of unrecognized
> characters.
>
>
> base Radix used for conversion.
>
>
> result Pointer to variable which contains the converted
> value.
>
>
> DESCRIPTION
> The ddi_strtoll() function converts the initial portion of
> the string pointed to by str to a type longlong_t
> representation and stores the converted value in result.
>
>
> The function first decomposes the input string into three
> parts:
>
> 1. An initial (possibly empty) sequence of white-space
> characters (' ', '\t', '\n', '\r', '\f')
>
> 2. A subject sequence interpreted as an integer
> represented in some radix determined by the value
> of base
>
> 3. A final string of one or more unrecognized charac-
> ters, including the terminating null byte of the
> input string.
>
>
> The ddi_strtoll() function then attempts to convert the sub-
> ject sequence to an integer and returns the result.
>
>
>
> SunOS 5.11 Last change: 20 Nov 2008 1
>
>
>
> Kernel Functions for Drivers ddi_strtoll(9F)
>
>
>
> If the value of base is 0, the expected form of the subject
> sequence is that of a decimal constant, octal constant or
> hexadecimal constant, any of which may be preceded by a plus
> ("+") or minus ("-") sign. A decimal constant begins with a
> non-zero digit, and consists of a sequence of decimal
> digits. An octal constant consists of the prefix 0 option-
> ally followed by a sequence of the digits 0 to 7 only. A
> hexadecimal constant consists of the prefix 0x or 0X fol-
> lowed by a sequence of the decimal digits and letters a (or
> A) to f (or F) with values 10 to 15 respectively.
>
>
> If the value of base is between 2 and 36, the expected form
> of the subject sequence is a sequence of letters and digits
> representing an integer with the radix specified by base,
> optionally preceded by a plus or minus sign. The letters
> from a (or A) to z (or Z) inclusive are ascribed the values
> 10 to 35 and only letters whose ascribed values are less
> than that of base are permitted. If the value of base is 16,
> the characters 0x or 0X may optionally precede the sequence
> of letters and digits, following the sign if present.
>
>
> The subject sequence is defined as the longest initial
> subsequence of the input string, starting with the first
> non-white-space character that is of the expected form. The
> subject sequence contains no characters if the input string
> is empty or consists entirely of white-space characters, or
> if the first non-white-space character is other than a sign
> or a permissible letter or digit.
>
>
> If the subject sequence has the expected form and the value
> of base is 0, the sequence of characters starting with the
> first digit is interpreted as an integer constant. If the
> subject sequence has the expected form and the value of base
> is between 2 and 36, it is used as the base for conversion,
> ascribing to each letter its value as given above. If the
> subject sequence begins with a minus sign, the value result-
> ing from the conversion is negated. A pointer to the final
> string is stored in the object pointed to by endptr, pro-
> vided that endptr is not a null pointer.
>
>
> If the subject sequence is empty or does not have the
> expected form, no conversion is performed and the value of
> str is stored in the object pointed to by endptr, provided
> that endptr is not a null pointer.
>
> RETURN VALUES
> Upon successful completion, ddi_strtoll() returns 0 and
> stores the converted value in result. If no conversion is
>
>
>
> SunOS 5.11 Last change: 20 Nov 2008 2
>
>
> Kernel Functions for Drivers ddi_strtoll(9F)
>
>
>
> performed due to invalid base, ddi_strtoll() returns EINVAL
> and the variable pointed by result is not changed.
>
>
> If the correct value is outside the range of representable
> values, ddi_strtoll() returns ERANGE and the value pointed
> to by result is not changed.
>
> CONTEXT
> The ddi_strtoll() function may be called from user, kernel
> or interrupt context.
>
> SEE ALSO
> Writing Device Drivers
>
>
> SunOS 5.11 Last change: 20 Nov 2008 3
>
>
>
>
> Kernel Functions for Drivers ddi_strtoull(9F)
>
>
> NAME
> ddi_strtoull - String conversion functions
>
> SYNOPSIS
> #include <sys/ddi.h>
> #include <sys/sunddi.h>
>
> int ddi_strtoull(const char *str, char **endptr, int base,
> u_longlong_t *result);
>
>
> INTERFACE LEVEL
> Solaris DDI specific (Solaris DDI)
>
> PARAMETERS
> str Pointer to a character string to be converted.
>
>
> endptr Post-conversion final string of unrecognized
> characters.
>
>
> base Radix used for conversion.
>
>
> result Pointer to variable which contains the converted
> value.
>
>
> DESCRIPTION
> The ddi_strtoull() function converts the initial portion of
> the string pointed to by str to a type u_longlong_t
> representation and stores the converted value in result.
>
>
> The function first decomposes the input string into three
> parts:
>
> 1. An initial (possibly empty) sequence of white-space
> characters (' ', '\t', '\n', '\r', '\f')
>
> 2. A subject sequence interpreted as an integer
> represented in some radix determined by the value
> of base
>
> 3. A final string of one or more unrecognized charac-
> ters, including the terminating null byte of the
> input string.
>
>
> The ddi_strtoull() function then attempts to convert the
> subject sequence to an unsigned integer and returns the
> result.
>
>
> SunOS 5.11 Last change: 20 Nov 2008 1
>
>
> Kernel Functions for Drivers ddi_strtoull(9F)
>
>
>
> If the value of base is 0, the expected form of the subject
> sequence is that of a decimal constant, octal constant or
> hexadecimal constant, any of which may be preceded by a plus
> ("+") or minus ("-") sign. A decimal constant begins with a
> non-zero digit, and consists of a sequence of decimal
> digits. An octal constant consists of the prefix 0 option-
> ally followed by a sequence of the digits 0 to 7 only. A
> hexadecimal constant consists of the prefix 0x or 0X fol-
> lowed by a sequence of the decimal digits and letters a (or
> A) to f (or F) with values 10 to 15 respectively.
>
>
> If the value of base is between 2 and 36, the expected form
> of the subject sequence is a sequence of letters and digits
> representing an integer with the radix specified by base,
> optionally preceded by a plus or minus sign. The letters
> from a (or A) to z (or Z) inclusive are ascribed the values
> 10 to 35 and only letters whose ascribed values are less
> than that of base are permitted. If the value of base is 16,
> the characters 0x or 0X may optionally precede the sequence
> of letters and digits, following the sign if present.
>
>
> The subject sequence is defined as the longest initial
> subsequence of the input string, starting with the first
> non-white-space character that is of the expected form. The
> subject sequence contains no characters if the input string
> is empty or consists entirely of white-space characters, or
> if the first non-white-space character is other than a sign
> or a permissible letter or digit.
>
>
> If the subject sequence has the expected form and the value
> of base is 0, the sequence of characters starting with the
> first digit is interpreted as an integer constant. If the
> subject sequence has the expected form and the value of base
> is between 2 and 36, it is used as the base for conversion,
> ascribing to each letter its value as given above. If the
> subject sequence begins with a minus sign, the value result-
> ing from the conversion is negated. A pointer to the final
> string is stored in the object pointed to by endptr, pro-
> vided that endptr is not a null pointer.
>
>
> If the subject sequence is empty or does not have the
> expected form, no conversion is performed and the value of
> str is stored in the object pointed to by endptr, provided
> that endptr is not a null pointer.
>
> RETURN VALUES
> Upon successful completion, ddi_strtoull() returns 0 and
> stores the converted value in result. If no conversion is
>
>
>
> SunOS 5.11 Last change: 20 Nov 2008 2
>
>
> Kernel Functions for Drivers ddi_strtoull(9F)
>
>
>
> performed due to invalid base, ddi_strtoull() returns EINVAL
> and the variable pointed by result is not changed.
>
>
> If the correct value is outside the range of representable
> values, ddi_strtoull() returns ERANGE and the value pointed
> to by result is not changed.
>
> CONTEXT
> The ddi_strtoull() function may be called from user, kernel
> or interrupt context.
>
> SEE ALSO
> Writing Device Drivers
>
>
> SunOS 5.11 Last change: 20 Nov 2008 3
>
>
>
> 6. Resources and Schedule
> 6.4. Steering Committee requested information
> 6.4.1. Consolidation C-team Name:
> ON
> 6.5. ARC review type: FastTrack
> 6.6. ARC Exposure: open
>
>
> 6. Resources and Schedule
> 6.4. Steering Committee requested information
> 6.4.1. Consolidation C-team Name:
> ON
> 6.5. ARC review type: FastTrack
> 6.6. ARC Exposure: open
>
>