mirror of
				https://github.com/Xahau/xahaud.git
				synced 2025-11-04 02:35:48 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			146 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/bash
 | 
						|
set -eu
 | 
						|
 | 
						|
SCRIPT_DIR=$(dirname "$0")
 | 
						|
SCRIPT_DIR=$(cd "$SCRIPT_DIR" && pwd)
 | 
						|
 | 
						|
APPLY_HOOK="$SCRIPT_DIR/../src/ripple/app/hook/applyHook.h"
 | 
						|
 | 
						|
{
 | 
						|
    echo '// For documentation please see: https://xrpl-hooks.readme.io/reference/'
 | 
						|
    echo '// Generated using generate_extern.sh'
 | 
						|
    echo '#include <stdint.h>'
 | 
						|
    echo '#ifndef HOOK_EXTERN'
 | 
						|
    echo
 | 
						|
    awk '
 | 
						|
        function trim(s) {
 | 
						|
            sub(/^[[:space:]]+/, "", s);
 | 
						|
            sub(/[[:space:]]+$/, "", s);
 | 
						|
            return s;
 | 
						|
        }
 | 
						|
 | 
						|
        function emit(ret, name, argc, argt, argn) {
 | 
						|
            attr = (name == "_g") ? " __attribute__((noduplicate))" : "";
 | 
						|
            if (!first)
 | 
						|
                printf("\n");
 | 
						|
            first = 0;
 | 
						|
            printf("extern %s%s\n", ret, attr);
 | 
						|
            if (argc == 0) {
 | 
						|
                printf("%s(void);\n", name);
 | 
						|
                return;
 | 
						|
            }
 | 
						|
            if (argc <= 3) {
 | 
						|
                line = argt[1] " " argn[1];
 | 
						|
                for (i = 2; i <= argc; ++i)
 | 
						|
                    line = line ", " argt[i] " " argn[i];
 | 
						|
                printf("%s(%s);\n", name, line);
 | 
						|
                return;
 | 
						|
            }
 | 
						|
            printf("%s(\n", name);
 | 
						|
            for (i = 1; i <= argc; ++i) {
 | 
						|
                sep = (i < argc) ? "," : ");";
 | 
						|
                printf("    %s %s%s\n", argt[i], argn[i], sep);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        function process(buffer, kind,    payload, parts, n, i, arg, tokens, argc, argt, argn) {
 | 
						|
            if (kind == "func")
 | 
						|
                sub(/^DECLARE_HOOK_FUNCTION[[:space:]]*\(/, "", buffer);
 | 
						|
            else
 | 
						|
                sub(/^DECLARE_HOOK_FUNCNARG[[:space:]]*\(/, "", buffer);
 | 
						|
            buffer = trim(buffer);
 | 
						|
            sub(/\)[[:space:]]*$/, "", buffer);
 | 
						|
            n = split(buffer, parts, ",");
 | 
						|
            for (i = 1; i <= n; ++i)
 | 
						|
                parts[i] = trim(parts[i]);
 | 
						|
            ret = parts[1];
 | 
						|
            name = parts[2];
 | 
						|
            argc = 0;
 | 
						|
            delete argt;
 | 
						|
            delete argn;
 | 
						|
            for (i = 3; i <= n; ++i) {
 | 
						|
                arg = parts[i];
 | 
						|
                if (arg == "")
 | 
						|
                    continue;
 | 
						|
                split(arg, tokens, /[[:space:]]+/);
 | 
						|
                if (length(tokens) < 2)
 | 
						|
                    continue;
 | 
						|
                ++argc;
 | 
						|
                argt[argc] = tokens[1];
 | 
						|
                argn[argc] = tokens[2];
 | 
						|
            }
 | 
						|
            emit(ret, name, argc, argt, argn);
 | 
						|
        }
 | 
						|
 | 
						|
        BEGIN {
 | 
						|
            first = 1;
 | 
						|
            in_block = 0;
 | 
						|
            in_macro = 0;
 | 
						|
        }
 | 
						|
 | 
						|
        {
 | 
						|
            line = $0;
 | 
						|
            if (in_block) {
 | 
						|
                if (line ~ /\*\//) {
 | 
						|
                    sub(/.*\*\//, "", line);
 | 
						|
                    in_block = 0;
 | 
						|
                }
 | 
						|
                else
 | 
						|
                    next;
 | 
						|
            }
 | 
						|
            while (line ~ /\/\*/) {
 | 
						|
                if (line ~ /\/\*.*\*\//) {
 | 
						|
                    gsub(/\/\*.*\*\//, "", line);
 | 
						|
                }
 | 
						|
                else {
 | 
						|
                    sub(/\/\*.*/, "", line);
 | 
						|
                    in_block = 1;
 | 
						|
                    break;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            sub(/\/\/.*$/, "", line);
 | 
						|
            line = trim(line);
 | 
						|
            if (line == "")
 | 
						|
                next;
 | 
						|
 | 
						|
            if (!in_macro && line ~ /^DECLARE_HOOK_FUNCTION\(/) {
 | 
						|
                buffer = line;
 | 
						|
                kind = "func";
 | 
						|
                if (line ~ /\);[[:space:]]*$/) {
 | 
						|
                    sub(/\);[[:space:]]*$/, "", buffer);
 | 
						|
                    process(buffer, kind);
 | 
						|
                }
 | 
						|
                else
 | 
						|
                    in_macro = 1;
 | 
						|
                next;
 | 
						|
            }
 | 
						|
            if (!in_macro && line ~ /^DECLARE_HOOK_FUNCNARG\(/) {
 | 
						|
                buffer = line;
 | 
						|
                kind = "narg";
 | 
						|
                if (line ~ /\);[[:space:]]*$/) {
 | 
						|
                    sub(/\);[[:space:]]*$/, "", buffer);
 | 
						|
                    process(buffer, kind);
 | 
						|
                }
 | 
						|
                else
 | 
						|
                    in_macro = 1;
 | 
						|
                next;
 | 
						|
            }
 | 
						|
            if (in_macro) {
 | 
						|
                buffer = buffer " " line;
 | 
						|
                if (line ~ /\);[[:space:]]*$/) {
 | 
						|
                    sub(/\);[[:space:]]*$/, "", buffer);
 | 
						|
                    process(buffer, kind);
 | 
						|
                    in_macro = 0;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        END {
 | 
						|
            printf("\n");
 | 
						|
        }
 | 
						|
    ' "$APPLY_HOOK"
 | 
						|
 | 
						|
    echo '#define HOOK_EXTERN'
 | 
						|
    echo '#endif  // HOOK_EXTERN'
 | 
						|
}
 |