diff options
Diffstat (limited to 'awk/rawk/temp.awk')
-rw-r--r-- | awk/rawk/temp.awk | 541 |
1 files changed, 0 insertions, 541 deletions
diff --git a/awk/rawk/temp.awk b/awk/rawk/temp.awk deleted file mode 100644 index 16a433b..0000000 --- a/awk/rawk/temp.awk +++ /dev/null @@ -1,541 +0,0 @@ -# --- rawk Standard Library --- -# Dispatch mechanism for rawk functions -function dispatch_call(func_name, arg1, arg2, arg3, arg4, arg5, metadata, parts, internal_name, arg_count) { - if (!(func_name in RAWK_DISPATCH)) { - print "Error: Function '" func_name "' not found" > "/dev/stderr" - return - } - metadata = RAWK_DISPATCH[func_name] - split(metadata, parts, "|") - internal_name = parts[1] - arg_count = parts[2] - # This is a simplified dispatch - in a real implementation, we'd need a more sophisticated approach - print "Error: Dispatch not fully implemented for function '" func_name "'" > "/dev/stderr" - return -} - -function apply(func_name, args, i, metadata, parts, internal_name, arg_count) { - if (!(func_name in RAWK_DISPATCH)) { - print "Error: Function '" func_name "' not found" > "/dev/stderr" - return - } - metadata = RAWK_DISPATCH[func_name] - split(metadata, parts, "|") - internal_name = parts[1] - arg_count = parts[2] - if (length(args) != arg_count) { - print "Error: Function '" func_name "' expects " arg_count " arguments, got " length(args) > "/dev/stderr" - return - } - return args[1] -} - -function map(func_name, array, result, i, metadata, parts, internal_name, arg_count) { - if (!(func_name in RAWK_DISPATCH)) { - print "❌ rawk runtime error: Function '" func_name "' not found" > "/dev/stderr" - print "💡 Available functions: " > "/dev/stderr" - for (f in RAWK_DISPATCH) { - print " - " f > "/dev/stderr" - } - return - } - metadata = RAWK_DISPATCH[func_name] - split(metadata, parts, "|") - internal_name = parts[1] - arg_count = parts[2] - if (arg_count != 1) { - print "❌ rawk runtime error: Function '" func_name "' must take exactly 1 argument for map" > "/dev/stderr" - print "💡 Function '" func_name "' takes " arg_count " arguments" > "/dev/stderr" - return - } - # Use a switch-based dispatch for standard awk compatibility - for (i in array) { - if (internal_name == "__lambda_0") result[i] = __lambda_0(array[i]) - else if (internal_name == "__lambda_1") result[i] = __lambda_1(array[i]) - else if (internal_name == "__lambda_2") result[i] = __lambda_2(array[i]) - else if (internal_name == "__lambda_3") result[i] = __lambda_3(array[i]) - else if (internal_name == "__lambda_4") result[i] = __lambda_4(array[i]) - else if (internal_name == "__lambda_5") result[i] = __lambda_5(array[i]) - else if (internal_name == "__lambda_6") result[i] = __lambda_6(array[i]) - else if (internal_name == "__lambda_7") result[i] = __lambda_7(array[i]) - else if (internal_name == "__lambda_8") result[i] = __lambda_8(array[i]) - else if (internal_name == "__lambda_9") result[i] = __lambda_9(array[i]) - else { - print "❌ rawk runtime error: Function '" func_name "' not supported in map" > "/dev/stderr" - print "💡 This is a limitation of the current implementation" > "/dev/stderr" - return - } - } - return result -} - -function reduce(func_name, array, initial_value, result, i, metadata, parts, internal_name, arg_count) { - if (!(func_name in RAWK_DISPATCH)) { - print "Error: Function '" func_name "' not found" > "/dev/stderr" - return - } - metadata = RAWK_DISPATCH[func_name] - split(metadata, parts, "|") - internal_name = parts[1] - arg_count = parts[2] - if (arg_count != 2) { - print "Error: Function '" func_name "' must take exactly 2 arguments for reduce" > "/dev/stderr" - return - } - result = initial_value - for (i in array) { - if (internal_name == "__lambda_0") result = __lambda_0(result, array[i]) - else if (internal_name == "__lambda_1") result = __lambda_1(result, array[i]) - else if (internal_name == "__lambda_2") result = __lambda_2(result, array[i]) - else if (internal_name == "__lambda_3") result = __lambda_3(result, array[i]) - else if (internal_name == "__lambda_4") result = __lambda_4(result, array[i]) - else if (internal_name == "__lambda_5") result = __lambda_5(result, array[i]) - else if (internal_name == "__lambda_6") result = __lambda_6(result, array[i]) - else if (internal_name == "__lambda_7") result = __lambda_7(result, array[i]) - else if (internal_name == "__lambda_8") result = __lambda_8(result, array[i]) - else if (internal_name == "__lambda_9") result = __lambda_9(result, array[i]) - else { - print "Error: Function '" func_name "' not supported in reduce" > "/dev/stderr" - return - } - } - return result -} - -function pipe(value, func_names, result, i, metadata, parts, internal_name) { - result = value - for (i = 1; i <= length(func_names); i++) { - if (!(func_names[i] in RAWK_DISPATCH)) { - print "Error: Function '" func_names[i] "' not found" > "/dev/stderr" - return - } - metadata = RAWK_DISPATCH[func_names[i]] - split(metadata, parts, "|") - internal_name = parts[1] - result = result * 2 - } - return result -} - -function get_keys(array, result, i, count) { - count = 0 - for (i in array) { - count++ - result[count] = i - } - return count -} - -function get_values(array, result, i, count) { - count = 0 - for (i in array) { - count++ - result[count] = array[i] - } - return count -} - -function keys(array) { - # This is a simplified version that just returns the count - count = 0 - for (i in array) { - count++ - } - return count -} - -function values(array) { - # This is a simplified version that just returns the count - count = 0 - for (i in array) { - count++ - } - return count -} - -# --- Predicate Functions --- -# Type checking and validation functions - -function is_number(value) { - # Check if value is a number (including 0) - return value == value + 0 -} - -function is_string(value) { - # Check if value is a string (not a number) - return value != value + 0 -} - -function is_array(value, i) { - # Check if value is an array by trying to iterate over it - # This is a heuristic - in awk, arrays are associative - # Note: This function has limitations in standard awk - # It can only detect arrays that have been passed as parameters - count = 0 - for (i in value) { - count++ - if (count > 0) return 1 - } - return 0 -} - -function is_empty(value) { - # Check if value is empty (empty string, 0, or empty array) - if (value == "") return 1 - if (value == 0) return 1 - if (is_array(value)) { - count = 0 - for (i in value) count++ - return count == 0 - } - return 0 -} - -function is_positive(value) { - # Check if value is a positive number - return is_number(value) && value > 0 -} - -function is_negative(value) { - # Check if value is a negative number - return is_number(value) && value < 0 -} - -function is_zero(value) { - # Check if value is zero - return is_number(value) && value == 0 -} - -function is_integer(value) { - # Check if value is an integer - return is_number(value) && int(value) == value -} - -function is_float(value) { - # Check if value is a floating point number - return is_number(value) && int(value) != value -} - -function is_boolean(value) { - # Check if value is a boolean (0 or 1) - return value == 0 || value == 1 -} - -function is_truthy(value) { - # Check if value is truthy (non-zero, non-empty) - if (is_number(value)) return value != 0 - if (is_string(value)) return value != "" - if (is_array(value)) { - count = 0 - for (i in value) count++ - return count > 0 - } - return 0 -} - -function is_falsy(value) { - # Check if value is falsy (zero, empty string, empty array) - return !is_truthy(value) -} - -function is_email(value) { - # Basic email validation - if (!is_string(value)) return 0 - if (value == "") return 0 - # Check for @ symbol and basic format - if (index(value, "@") == 0) return 0 - if (index(value, "@") == length(value)) return 0 - if (index(value, "@") == 0) return 0 - # Check for domain part - split(value, parts, "@") - if (length(parts) != 2) return 0 - if (parts[1] == "" || parts[2] == "") return 0 - if (index(parts[2], ".") == 0) return 0 - if (index(parts[2], ".") == length(parts[2])) return 0 - return 1 -} - -function is_url(value) { - # Basic URL validation - if (!is_string(value)) return 0 - if (value == "") return 0 - # Check for http:// or https:// - if (substr(value, 1, 7) == "http://") return 1 - if (substr(value, 1, 8) == "https://") return 1 - return 0 -} - -function is_ipv4(value) { - # Basic IPv4 validation - if (!is_string(value)) return 0 - if (value == "") return 0 - # Split by dots and check each octet - split(value, octets, ".") - if (length(octets) != 4) return 0 - for (i = 1; i <= 4; i++) { - if (!is_number(octets[i])) return 0 - if (octets[i] < 0 || octets[i] > 255) return 0 - } - return 1 -} - -function is_alpha(value) { - # Check if string contains only alphabetic characters - if (!is_string(value)) return 0 - if (value == "") return 0 - # Remove all alphabetic characters and check if empty - gsub(/[a-zA-Z]/, "", value) - return value == "" -} - -function is_numeric(value) { - # Check if string contains only numeric characters - if (!is_string(value)) return 0 - if (value == "") return 0 - # Remove all numeric characters and check if empty - gsub(/[0-9]/, "", value) - return value == "" -} - -function is_alphanumeric(value) { - # Check if string contains only alphanumeric characters - if (!is_string(value)) return 0 - if (value == "") return 0 - # Remove all alphanumeric characters and check if empty - gsub(/[a-zA-Z0-9]/, "", value) - return value == "" -} - -function is_whitespace(value) { - # Check if string contains only whitespace characters - if (!is_string(value)) return 0 - if (value == "") return 0 - # Remove all whitespace characters and check if empty - gsub(/[ \t\n\r]/, "", value) - return value == "" -} - -function is_uppercase(value) { - # Check if string is all uppercase - if (!is_string(value)) return 0 - if (value == "") return 0 - # Convert to uppercase and compare - return toupper(value) == value -} - -function is_lowercase(value) { - # Check if string is all lowercase - if (!is_string(value)) return 0 - if (value == "") return 0 - # Convert to lowercase and compare - return tolower(value) == value -} - -function is_palindrome(value) { - # Check if string is a palindrome - if (!is_string(value)) return 0 - if (value == "") return 1 - # Remove non-alphanumeric characters and convert to lowercase - gsub(/[^a-zA-Z0-9]/, "", value) - value = tolower(value) - # Check if it reads the same forwards and backwards - len = length(value) - for (i = 1; i <= len/2; i++) { - if (substr(value, i, 1) != substr(value, len-i+1, 1)) return 0 - } - return 1 -} - -function is_prime(value) { - # Check if number is prime - if (!is_integer(value)) return 0 - if (value < 2) return 0 - if (value == 2) return 1 - if (value % 2 == 0) return 0 - # Check odd divisors up to square root - for (i = 3; i <= sqrt(value); i += 2) { - if (value % i == 0) return 0 - } - return 1 -} - -function is_even(value) { - # Check if number is even - return is_integer(value) && value % 2 == 0 -} - -function is_odd(value) { - # Check if number is odd - return is_integer(value) && value % 2 == 1 -} - -function is_in_range(value, min, max) { - # Check if number is within range [min, max] - return is_number(value) && value >= min && value <= max -} - -function is_length(value, expected_length, i, count) { - # Check if string or array has specific length - if (is_string(value)) return length(value) == expected_length - if (is_array(value)) { - count = 0 - for (i in value) count++ - return count == expected_length - } - return 0 -} - -function assert(condition, message) { - if (!condition) { - print "ASSERTION FAILED: " message > "/dev/stderr" - print " at line " FNR " in " FILENAME > "/dev/stderr" - exit 1 - } - return 1 -} - -function expect_equal(actual, expected, message) { - if (actual != expected) { - print "EXPECTATION FAILED: " message > "/dev/stderr" - print " Expected: " expected > "/dev/stderr" - print " Actual: " actual > "/dev/stderr" - print " at line " FNR " in " FILENAME > "/dev/stderr" - exit 1 - } - return 1 -} - -function expect_true(condition, message) { - return assert(condition, message) -} - -function expect_false(condition, message) { - return assert(!condition, message) -} - -# --- Recursive Function Call Replacement --- -function replace_recursive_calls(line) { - # This function replaces any remaining function calls with internal names - # This handles recursive calls that weren't replaced in the first pass - gsub("classify_string\\(", "__lambda_2(", line) - gsub("run_test\\(", "__lambda_0(", line) - gsub("classify_number\\(", "__lambda_1(", line) - gsub("validate_input\\(", "__lambda_4(", line) - gsub("classify_type\\(", "__lambda_3(", line) - return line -} - -# --- Post-processed User Functions --- -function __lambda_0(name, actual, expected) { - total_tests++ - if (actual == expected) { - passed_tests++ - print "✓ " name - } else { - failed_tests++ - print "❌ " name " (expected '" expected "', got '" actual "')" - -} - -function __lambda_1(value) { - if (value == 0) { return "zero" } - else if (1 && (is_positive(value))) { return "positive" } - else if (1 && (is_negative(value))) { return "negative" } - else if (1) { return "unknown" } -} - -function __lambda_2(str) { - if (str == "") { return "empty" } - else if (str == && (is_alpha(str))) { return "alphabetic" } - else if (str == && (is_numeric(str))) { return "numeric" } - else if (str == && (is_alphanumeric(str))) { return "alphanumeric" } - else if (str == && (is_palindrome(str))) { return "palindrome" } - else if (1) { return "other" } -} - -function __lambda_3(value) { - if (1 && (is_number(value))) { return "number" } - else if (1 && (is_string(value))) { return "string" } - else if (1 && (is_empty(value))) { return "empty" } - else if (1) { return "unknown" } -} - -function __lambda_4(value) { - if (value == "") { return "empty input" } - else if (1 && (is_email(value))) { return "valid email" } - else if (1 && (is_url(value))) { return "valid url" } - else if (1 && (is_ipv4(value))) { return "valid ipv4" } - else if (1 && (is_number(value) && is_in_range(value, 1, 100))) { return "valid number in range" } - else if (1) { return "invalid input" } -} - -# --- Main Script Body --- -# Test suite for rawk pattern matching -# This demonstrates the new pattern matching capabilities - -BEGIN { - print "=== rawk Pattern Matching Test Suite ===" - print "" - - # Test counters - total_tests = 0 - passed_tests = 0 - failed_tests = 0 - - # Helper function to run tests - } - - # Pattern matching function for number classification - - # Pattern matching function for string classification - - # Pattern matching function for type checking - - # Pattern matching function for validation - - # Test number classification - print "=== Number Classification Tests ===" - __lambda_0("__lambda_1(0)", __lambda_1(0), "zero") - __lambda_0("__lambda_1(42)", __lambda_1(42), "positive") - __lambda_0("__lambda_1(-5)", __lambda_1(-5), "negative") - __lambda_0("__lambda_1(3.14)", __lambda_1(3.14), "positive") - - print "" - print "=== String Classification Tests ===" - __lambda_0("__lambda_2(\"\")", __lambda_2(""), "empty") - __lambda_0("__lambda_2(\"hello\")", __lambda_2("hello"), "alphabetic") - __lambda_0("__lambda_2(\"123\")", __lambda_2("123"), "numeric") - __lambda_0("__lambda_2(\"Hello123\")", __lambda_2("Hello123"), "alphanumeric") - __lambda_0("__lambda_2(\"racecar\")", __lambda_2("racecar"), "palindrome") - __lambda_0("__lambda_2(\"hello world\")", __lambda_2("hello world"), "other") - - print "" - print "=== Type Classification Tests ===" - __lambda_0("__lambda_3(42)", __lambda_3(42), "number") - __lambda_0("__lambda_3(\"hello\")", __lambda_3("hello"), "string") - __lambda_0("__lambda_3(\"\")", __lambda_3(""), "empty") - __lambda_0("__lambda_3(0)", __lambda_3(0), "number") - - print "" - print "=== Validation Tests ===" - __lambda_0("__lambda_4(\"\")", __lambda_4(""), "empty input") - __lambda_0("__lambda_4(\"user@example.com\")", __lambda_4("user@example.com"), "valid email") - __lambda_0("__lambda_4(\"http://example.com\")", __lambda_4("http://example.com"), "valid url") - __lambda_0("__lambda_4(\"192.168.1.1\")", __lambda_4("192.168.1.1"), "valid ipv4") - __lambda_0("__lambda_4(50)", __lambda_4(50), "valid number in range") - __lambda_0("__lambda_4(150)", __lambda_4(150), "invalid input") - __lambda_0("__lambda_4(\"invalid\")", __lambda_4("invalid"), "invalid input") - - # Print summary - print "" - print "=== Test Summary ===" - print "Total tests: " total_tests - print "Passed: " passed_tests - print "Failed: " failed_tests - - if (failed_tests == 0) { - print "🎉 All pattern matching tests passed!" - } else { - print "❌ Some tests failed!" - } -} |