Imported Upstream version 7.59.0
[platform/upstream/curl.git] / lib / objnames.inc
1 # ***************************************************************************
2 # *                                  _   _ ____  _
3 # *  Project                     ___| | | |  _ \| |
4 # *                             / __| | | | |_) | |
5 # *                            | (__| |_| |  _ <| |___
6 # *                             \___|\___/|_| \_\_____|
7 # *
8 # * Copyright (C) 2012 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
9 # *
10 # * This software is licensed as described in the file COPYING, which
11 # * you should have received as part of this distribution. The terms
12 # * are also available at https://curl.haxx.se/docs/copyright.html.
13 # *
14 # * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15 # * copies of the Software, and permit persons to whom the Software is
16 # * furnished to do so, under the terms of the COPYING file.
17 # *
18 # * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19 # * KIND, either express or implied.
20 # *
21 # ***************************************************************************
22
23 #
24 # This file is sourced from curl/packages/OS400/initscript.sh and
25 # other Bourne shell scripts. Keep it as portable as possible.
26 #
27
28 #
29 # curl_10char_object_name
30 #
31 # This shell function accepts a single string argument with unspecified
32 # length representing a (*.c) source file name and returns a string which
33 # is a transformation of given argument.
34 #
35 # The intended purpose of this function is to transliterate a (*.c) source
36 # file name that may be longer than 10 characters, or not, into a string
37 # with at most 10 characters which may be used as an OS/400 object name.
38 #
39 # This function might not be universally useful, nor we care about it.
40 #
41 # It is intended to be used with libcurl's (*.c) source file names, so
42 # dependency on libcurl's source file naming scheme is acceptable and
43 # good enough for its intended use. Specifically it makes use of the fact
44 # that libcurl's (*.c) source file names which may be longer than 10 chars
45 # are conformed with underscore '_' separated substrings, or separated by
46 # other character which does not belong to the [0-9], [a-z] or [A-Z] sets.
47 #
48 # This allows repeatable and automatic short object name generation with
49 # no need for a hardcoded mapping table.
50 #
51 # Transformation is done in the following way:
52 #
53 # 1) Leading directory components are removed.
54 # 2) Leftmost dot character and any other char following it are removed.
55 # 3) Lowercase characters are transliterated to uppercase.
56 # 4) Characters not in [A-Z] or [0-9] are transliterated to underscore '_'.
57 # 5) Every sequence of one or more underscores is replaced with a single one.
58 # 6) Five leftmost substrings which end in an underscore character are
59 #    replaced by the first character of each substring, while retaining
60 #    the rest of the string.
61 # 7) Finally the result is truncated to 10 characters.
62 #
63 # Resulting object name may be shorter than 10 characters.
64 #
65 # Test case 1221 does unit testng of this function and also verifies
66 # that it is possible to generate distinct short object names for all
67 # curl and libcurl *.c source file names.
68 #
69
70 curl_10char_object_name() {
71   echo "${1}" | \
72   sed -e 's:.*/::' \
73    -e 's:[.].*::' \
74    -e 'y:abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:' \
75    -e 's:[^ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_]:_:g' \
76    -e 's:__*:_:g' \
77    -e 's:\([^_]\)[^_]*_\(.*\):\1\2:' \
78    -e 's:\([^_]\)\([^_]\)[^_]*_\(.*\):\1\2\3:' \
79    -e 's:\([^_]\)\([^_]\)\([^_]\)[^_]*_\(.*\):\1\2\3\4:' \
80    -e 's:\([^_]\)\([^_]\)\([^_]\)\([^_]\)[^_]*_\(.*\):\1\2\3\4\5:' \
81    -e 's:\([^_]\)\([^_]\)\([^_]\)\([^_]\)\([^_]\)[^_]*_\(.*\):\1\2\3\4\5\6:' \
82    -e 's:^\(..........\).*:\1:'
83 }
84
85 #
86 # curl_8char_object_name
87 #
88 # Same as curl_10char_object_name() description and details above, except
89 # that object name is limited to 8 characters maximum.
90 #
91
92 curl_8char_object_name() {
93   echo "${1}" | \
94   sed -e 's:.*/::' \
95    -e 's:[.].*::' \
96    -e 'y:abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:' \
97    -e 's:[^ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_]:_:g' \
98    -e 's:__*:_:g' \
99    -e 's:\([^_]\)[^_]*_\(.*\):\1\2:' \
100    -e 's:\([^_]\)\([^_]\)[^_]*_\(.*\):\1\2\3:' \
101    -e 's:\([^_]\)\([^_]\)\([^_]\)[^_]*_\(.*\):\1\2\3\4:' \
102    -e 's:\([^_]\)\([^_]\)\([^_]\)\([^_]\)[^_]*_\(.*\):\1\2\3\4\5:' \
103    -e 's:\([^_]\)\([^_]\)\([^_]\)\([^_]\)\([^_]\)[^_]*_\(.*\):\1\2\3\4\5\6:' \
104    -e 's:^\(........\).*:\1:'
105 }
106
107 # end of objectname.inc