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 70curl_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 92curl_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 108