From 3cf17ef3284304d8dfe37c3dcc95afafc9fe296a Mon Sep 17 00:00:00 2001 From: Krister Jansson Date: Tue, 20 Nov 2018 23:32:14 +0100 Subject: [PATCH] 0.1 --- .gitattributes | 2 +- .vscode/c_cpp_properties.json | 23 +++ .vscode/settings.json | 23 +++ IconAlign | Bin 0 -> 12704 bytes b | 3 + b.bat | 4 + r | Bin 0 -> 12704 bytes src/main.asm | 1 + src/main.c | 351 +++++++++++++++++++++++++++++++++- tempicons | 2 + 10 files changed, 406 insertions(+), 3 deletions(-) create mode 100644 .vscode/c_cpp_properties.json create mode 100644 .vscode/settings.json create mode 100644 IconAlign create mode 100644 b create mode 100644 b.bat create mode 100644 r create mode 100644 src/main.asm create mode 100644 tempicons diff --git a/.gitattributes b/.gitattributes index dfe0770..4bb50dc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,2 @@ # Auto detect text files and perform LF normalization -* text=auto +* text eol=lf \ No newline at end of file diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..6895c03 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,23 @@ +{ + "configurations": [ + { + "name": "Win32", + "includePath": [ + "${workspaceFolder}/**", + "E:/Amiga/KrustWB3/Output/Dev/SDK/NDK_3.9/Include/include_h", + "E:/Amiga/KrustWB3/Output/Dev/vbcc_posix/targets/m68k-amigaos/include" + ], + "defines": [ + "_DEBUG", + "UNICODE", + "_UNICODE" + ], + "windowsSdkVersion": "10.0.16299.0", + "compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/VC/Tools/MSVC/14.11.25503/bin/Hostx64/x64/cl.exe", + "cStandard": "c11", + "cppStandard": "c++17", + "intelliSenseMode": "msvc-x64" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..a9e011b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,23 @@ +{ + "files.associations": { + "*.s": "m68k", + "startup.h": "c", + "types.h": "c", + "dos.h": "c", + "workbench.h": "c", + "tasks.h": "c", + "lists.h": "c", + "icon.h": "c", + "icon_pragmas.h": "c", + "icon_protos.h": "c", + "icon_lib.h": "c", + "exec_protos.h": "c", + "dos_pragmas.h": "c", + "dos_protos.h": "c", + "exec.h": "c", + "exec_pragmas.h": "c", + "dirent.h": "c", + "unistd.h": "c" + }, + "C_Cpp.intelliSenseEngineFallback": "Disabled" +} \ No newline at end of file diff --git a/IconAlign b/IconAlign new file mode 100644 index 0000000000000000000000000000000000000000..57c789d25f1a0466113cec9e700421f438c841ec GIT binary patch literal 12704 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 +#include +#include +#include +#include -int main() +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +// VBCC +extern size_t __stack_usage; + +// Version tag +#define VERSTAG "\0$VER: IconAlign 0.1 (18.11.2018)" +UBYTE versiontag[] = VERSTAG; + +// Build Platform +#ifdef BUILD_PLATFORM_AMIGA +const char *BuildPlatform = "Amiga"; +#elif BUILD_PLATFORM_WIN +const char *BuildPlatform = "Win"; +#else +const char *BuildPlatform = "Unknown"; +#endif + +// Libraries +// int _IconBaseVer = 45; +struct Library *DosBase = NULL; +struct Library *IconBase = NULL; + +// Logging +short verbose = FALSE; +void Information(const char *fmt, ...); +void Verbose(const char *fmt, ...); + +// String/Path handling +size_t maxPathTreshold = PATH_MAX - 2; +short StringEndsWith(const char *str, const char *suffix); +void StringToLower(char *str, unsigned int strLen, unsigned int offset); + +// Icon alignment +long XAlignment = 16; +long YAlignment = 16; +unsigned int AlignCurrentWorkingDir(); +unsigned int AlignDir(unsigned char *diskObjectName); +unsigned int AlignIcon(unsigned char *diskObjectName); + +int main(int argc, char **argv) +{ + // Open libraries + DosBase = OpenLibrary("dos.library", 40L); + if (!DosBase) + { + Information("Failed to open dos.library 40\n"); + return RETURN_ERROR; + } + + IconBase = OpenLibrary("icon.library", 45L); + if (!IconBase) + { + Information("Failed to open icon.library 45\n"); + return RETURN_ERROR; + } + + // check arguments + long argArray[] = + { + 0, + // 0, + 0}; + struct RDArgs *rdargs = ReadArgs("FILE/K,DIR/K,VERBOSE/S", argArray, NULL); + if (!rdargs) + { + // GetFa + PrintFault(IoErr(), NULL); + return RETURN_ERROR; + } + + verbose = argArray[2] == DOSTRUE; + if (verbose) + { + Verbose(" VERBOSE logging active\n"); + } + STRPTR fileOption = (STRPTR)argArray[0]; + if (fileOption) + { + Verbose(" FILE=[%s]\n", fileOption); + } + unsigned char *dirOption = (unsigned char *)argArray[1]; + if (dirOption) + { + Verbose(" DIR=[%s]\n", dirOption); + } + // if (!fileOption && !folderOption) + // { + // Information("please provide FILE or FOLDER option\n"); + // return RETURN_ERROR; + // } + + unsigned int fixCount = 0; + if (!fileOption && !dirOption) + { + fixCount = AlignCurrentWorkingDir(); + } + else if (fileOption) + { + fixCount = AlignIcon(fileOption); + } + else if (dirOption) + { + size_t dirOptionLen = strlen(dirOption); + if (dirOptionLen == 0) + { + fixCount = AlignCurrentWorkingDir(); + } + else + { + fixCount = AlignDir(dirOption); + } + } + if (fixCount == 0) + { + Information("No icons found\n"); + } + + // if (argc != 2) + // { + // printf("incorrect args!\n"); + // printf("usage: IconAlign FILE\n"); + // return RETURN_ERROR; + // } + + if (rdargs) + { + FreeArgs(rdargs); + } + CloseLibrary(IconBase); + + Verbose("Build platform: %s\n", BuildPlatform); + Verbose("Stack used: %lu\n", (unsigned long)__stack_usage); + // Verbose("IconBase: %p\n", (void *)IconBase); + // Verbose("SysBase: %p\n", (void *)SysBase); + Verbose("DosBase: %p\n", (void *)DosBase); + + return RETURN_OK; +} + +// Logging +void Verbose(const char *fmt, ...) +{ + if (!verbose) + return; + + va_list args; + va_start(args, fmt); + vfprintf(stdout, fmt, args); + va_end(args); +} + +void Information(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + vfprintf(stdout, fmt, args); + va_end(args); +} + +// String/Path handling +short StringEndsWith(const char *str, const char *suffix) +{ + if (!str || !suffix) + { + return FALSE; + } + size_t lenstr = strlen(str); + size_t lensuffix = strlen(suffix); + if (lensuffix > lenstr) + { + return FALSE; + } + return strncmp(str + lenstr - lensuffix, suffix, lensuffix) == 0; +} + +void StringToLower(char *str, unsigned int strLen, unsigned int offset) +{ + // Verbose("StringToLower from: %s\n", str); + if (offset >= strLen) + { + return; + } + for (int i = offset; i < strLen; i++) + { + unsigned char curr = str[i]; + if (curr >= 'A' && curr <= 'Z') + { + str[i] = curr + 32; + } + // TODO: Not really needed for this app! But åäö etc. + } + // Verbose("StringToLower result: %s\n", str); +} + +// Icon management +unsigned int AlignCurrentWorkingDir() +{ + char cwd[PATH_MAX]; + if (getcwd(cwd, sizeof(cwd)) != NULL) + { + Verbose("Using current working dir: %s\n", cwd); + } + unsigned int fixCount = AlignDir(cwd); + return fixCount; +} + +unsigned int AlignDir(unsigned char *dirName) +{ + size_t dirNameLen = strlen(dirName); + if (dirNameLen > maxPathTreshold) + { + Information("path \"%s\" is too long - skipping!\n", dirName); + return 0; + } + if (!StringEndsWith(dirName, "/") && !StringEndsWith(dirName, ":")) + { + Verbose("Appending \"/\" to dir\n"); + unsigned char fixedDirName[PATH_MAX]; + strcpy(fixedDirName, dirName); + fixedDirName[dirNameLen] = '/'; + fixedDirName[dirNameLen + 1] = 0; + dirName = fixedDirName; + dirNameLen += 1; + } + + unsigned int fixCount = 0; + DIR *dir = opendir(dirName); + struct dirent *direntry; + if (dir) + { + // Verbose("dirNameLen: %i", dirNameLen); + while ((direntry = readdir(dir)) != NULL) + { + size_t dirEntryLen = strlen(direntry->d_name); + size_t fullLen = dirNameLen + dirEntryLen; + if (fullLen > PATH_MAX - 2) + { + Information("full path to %s is too long - skipping!\n", direntry->d_name); + } + else + { + unsigned char fullPath[PATH_MAX]; + strcpy(fullPath, dirName); + strcat(fullPath, direntry->d_name); + StringToLower(fullPath, fullLen, fullLen - 4); + if (StringEndsWith(fullPath, ".info")) + { + fullPath[fullLen - 5] = 0; + // Verbose("fullPath: %s\n", fullPath); + fixCount += AlignIcon(fullPath); + } + } + //printf("%s\n", direntry->d_name); + } + closedir(dir); + } + return fixCount; +} + +unsigned int AlignIcon(unsigned char *diskObjectName) +{ + struct DiskObject *diskObject = GetDiskObject(diskObjectName); + if (diskObject) + { + Verbose("Icon found: %s\n", diskObjectName); + // Verbose("do_Magic: %x\n", diskObject->do_Magic); + Verbose(" Version: %hi\n", diskObject->do_Version); + Verbose(" do_Type: %i\n", (int)diskObject->do_Type); + Verbose(" do_DefaultTool: %s\n", diskObject->do_DefaultTool); + // Verbose("do_DefaultTool: "); + // Verbose(diskObject->do_DefaultTool); + // Verbose("\n"); + Verbose(" do_CurrentX: %li\n", diskObject->do_CurrentX); + Verbose(" do_CurrentY: %li\n", diskObject->do_CurrentY); + // Verbose(" Width: %hi\n", diskObject->); + Verbose(" Width: %hi\n", diskObject->do_Gadget.Width); + Verbose(" Height: %hi\n", diskObject->do_Gadget.Height); + // Verbose(" GadgetRender: %p\n", diskObject->do_Gadget.GadgetRender); + Verbose(" Flags: %hi\n", diskObject->do_Gadget.Flags); + Verbose(" GadgetType: %hi\n", diskObject->do_Gadget.GadgetType); + Verbose(" LeftEdge: %hi\n", diskObject->do_Gadget.LeftEdge); + Verbose(" TopEdge: %hi\n", diskObject->do_Gadget.TopEdge); + + // diskObject->do_CurrentX += 10; + if (diskObject->do_CurrentX == NO_ICON_POSITION && diskObject->do_CurrentX == NO_ICON_POSITION) + { + Information("Skip \"%s\" - no icon position\n", diskObjectName); + return 0; + } + + short xaligned = FALSE; + if (diskObject->do_CurrentX != NO_ICON_POSITION) + { + // Information("Skip X \"%s\" - no icon position for X\n"); + long currx = diskObject->do_CurrentX + (XAlignment / 2); + long newx = currx - (currx % XAlignment); + if (newx != diskObject->do_CurrentX) + { + xaligned = TRUE; + } + // printf("change x from %li to %li\n", currx, newx); + diskObject->do_CurrentX = newx; + // long XAlignment = 16; + // long YAlignment = 16; + } + short yaligned = FALSE; + if (diskObject->do_CurrentY != NO_ICON_POSITION) + { + // Information("Skip Y \"%s\" - no icon position for Y\n"); + // TODO: Align bottom, not top! + long curry = diskObject->do_CurrentY + (YAlignment / 2); + long newy = curry - (curry % YAlignment); + if (newy != diskObject->do_CurrentY) + { + yaligned = TRUE; + diskObject->do_CurrentY = newy; + } + } + + if (!xaligned && !yaligned) + { + Information("Already aligned \"%s\"\n", diskObjectName); + return 0; + } + + PutDiskObject(diskObjectName, diskObject); + FreeDiskObject(diskObject); + + Information("Aligend \"%s\"\n", diskObjectName); + return 1; + } + Verbose("Skipped \"%s\" - icon not found\n", diskObjectName); + return 0; +} diff --git a/tempicons b/tempicons new file mode 100644 index 0000000..b7751ac --- /dev/null +++ b/tempicons @@ -0,0 +1,2 @@ +makedir ram:sys +copy a-system:#?.info ram:sys/ \ No newline at end of file