Skip to content

Commit

Permalink
feat(generator): [NFD] Update generator
Browse files Browse the repository at this point in the history
  • Loading branch information
squid233 committed Dec 5, 2024
1 parent 4cf3be5 commit b5e46c5
Show file tree
Hide file tree
Showing 6 changed files with 403 additions and 53 deletions.
190 changes: 181 additions & 9 deletions generators/nfd/src/main/java/overrungl/nfd/NFDGenerator.kt
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ val U8char = CharVariant(
fun main() {
val NFDInternal = ClassName.get("overrungl.nfd", "NFDInternal")

//region Structs
fun NFDFilterItem(variant: CharVariant, utf: String, charset: CodeBlock) {
struct(
"overrungl.nfd",
Expand Down Expand Up @@ -195,6 +196,7 @@ fun main() {
NFDPickFolderArgs(U8char)
NFDPickFolderArgs(Nchar)
StructRegistration.generate("overrungl.nfd", "NFDStructTypes")
//endregion

downcall("overrungl.nfd", "CNFD", javadoc = {
doFirst { add("Base functions of {@link \$T}.", ClassName.get("overrungl.nfd", "NFD")) }
Expand All @@ -217,6 +219,7 @@ fun main() {
)
}

//region methods
fun freePath(variant: CharVariant) {
"freePath${variant.uppercaseName}"(
void,
Expand Down Expand Up @@ -257,10 +260,10 @@ fun main() {
variant.nfdchar_t_ptr_ptr("outPath"),
variant.const_nfdfilteritem_t_ptr("filterList"),
nfdfiltersize_t("filterCount") {
javadoc = CodeBlock.of("If zero, filterList is ignored (you can use null).")
javadoc = CodeBlock.of("If zero, filterList is ignored (you can use null).\n")
},
variant.const_nfdchar_t_ptr("defaultPath") {
javadoc = CodeBlock.of("If null, the operating system will decide.")
javadoc = CodeBlock.of("If null, the operating system will decide.\n")
},
entrypoint = "NFD_OpenDialog${variant.uppercaseName}",
javadoc = {
Expand Down Expand Up @@ -317,10 +320,10 @@ fun main() {
const_nfdpathset_t_ptr_ptr("outPaths"),
variant.const_nfdfilteritem_t_ptr("filterList"),
nfdfiltersize_t("filterCount") {
javadoc = CodeBlock.of("If zero, filterList is ignored (you can use null).")
javadoc = CodeBlock.of("If zero, filterList is ignored (you can use null).\n")
},
variant.const_nfdchar_t_ptr("defaultPath") {
javadoc = CodeBlock.of("If null, the operating system will decide.")
javadoc = CodeBlock.of("If null, the operating system will decide.\n")
},
entrypoint = "NFD_OpenDialogMultiple${variant.uppercaseName}",
javadoc = {
Expand Down Expand Up @@ -385,10 +388,10 @@ fun main() {
variant.nfdchar_t_ptr_ptr("outPath"),
variant.const_nfdfilteritem_t_ptr("filterList"),
nfdfiltersize_t("filterCount") {
javadoc = CodeBlock.of("If zero, filterList is ignored (you can use null).")
javadoc = CodeBlock.of("If zero, filterList is ignored (you can use null).\n")
},
variant.const_nfdchar_t_ptr("defaultPath") {
javadoc = CodeBlock.of("If null, the operating system will decide.")
javadoc = CodeBlock.of("If null, the operating system will decide.\n")
},
variant.const_nfdchar_t_ptr("defaultName"),
entrypoint = "NFD_SaveDialog${variant.uppercaseName}",
Expand Down Expand Up @@ -446,7 +449,7 @@ fun main() {
nfdresult_t,
variant.nfdchar_t_ptr_ptr("outPath"),
variant.const_nfdchar_t_ptr("defaultPath") {
javadoc = CodeBlock.of("If null, the operating system will decide.")
javadoc = CodeBlock.of("If null, the operating system will decide.\n")
},
entrypoint = "NFD_PickFolder${variant.uppercaseName}",
javadoc = {
Expand Down Expand Up @@ -502,7 +505,7 @@ fun main() {
nfdresult_t,
const_nfdpathset_t_ptr_ptr("outPaths"),
variant.const_nfdchar_t_ptr("defaultPath") {
javadoc = CodeBlock.of("If null, the operating system will decide.")
javadoc = CodeBlock.of("If null, the operating system will decide.\n")
},
entrypoint = "NFD_PickFolderMultiple${variant.uppercaseName}",
javadoc = {
Expand Down Expand Up @@ -682,6 +685,7 @@ fun main() {
entrypoint = "NFD_PathSet_Free",
javadoc = { add("Free the pathSet") }
)
//endregion
}.also {
// TODO
val path = Path("overrungl", "nfd", "NFDstatic.java")
Expand Down Expand Up @@ -714,11 +718,179 @@ fun main() {
.build()
)
}

val nfdCharset = ", NFDInternal.nfdCharset"
val StringArray = ArrayTypeName.of(String::class.java)

fun openDialog(variant: CharVariant, charset: String) {
codeBuilder.add(
"$1L",
MethodSpec.methodBuilder("openDialog${variant.uppercaseName}")
.addJavadoc("Overloads {@link #openDialog${variant.uppercaseName}(MemorySegment, MemorySegment, int, MemorySegment)}")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.returns(TypeName.INT)
.addParameter(StringArray, "outPath")
.addParameter(ClassName.get("overrungl.nfd", "NFD${variant.uppercaseName}FilterItem"), "filterList")
.addParameter(String::class.java, "defaultPath")
.beginControlFlow("try (MemoryStack stack = MemoryStack.pushLocal())")
.addStatement("var seg = Marshal.marshal(stack, outPath$1L)", charset)
.addStatement(
"int result = openDialog${variant.uppercaseName}(seg, Marshal.marshal(filterList), filterItemCount(filterList), Marshal.marshal(stack, defaultPath$1L))",
charset
)
.beginControlFlow("if (result == OKAY)")
.addStatement("copyOutPath${variant.uppercaseName}(seg, outPath)")
.endControlFlow()
.addStatement("return result")
.endControlFlow()
.build()
)
}
openDialog(Nchar, nfdCharset)
openDialog(U8char, "")

fun openDialogWith(variant: CharVariant, charset: String) {
codeBuilder.add(
"$1L",
MethodSpec.methodBuilder("openDialog${variant.uppercaseName}With")
.addJavadoc("Overloads {@link #openDialog${variant.uppercaseName}With(MemorySegment, MemorySegment)}")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.returns(TypeName.INT)
.addParameter(StringArray, "outPath")
.addParameter(ClassName.get("overrungl.nfd", "NFDOpenDialog${variant.uppercaseName}Args"), "args")
.beginControlFlow("try (MemoryStack stack = MemoryStack.pushLocal())")
.addStatement("var seg = Marshal.marshal(stack, outPath$1L)", charset)
.addStatement("int result = openDialog${variant.uppercaseName}With(seg, Marshal.marshal(args))")
.beginControlFlow("if (result == OKAY)")
.addStatement("copyOutPath${variant.uppercaseName}(seg, outPath)")
.endControlFlow()
.addStatement("return result")
.endControlFlow()
.build()
)
}
openDialogWith(Nchar, nfdCharset)
openDialogWith(U8char, "")

fun openDialogMultiple(variant: CharVariant, charset: String) {
codeBuilder.add(
"$1L",
MethodSpec.methodBuilder("openDialogMultiple${variant.uppercaseName}")
.addJavadoc("Overloads {@link #openDialogMultiple${variant.uppercaseName}(MemorySegment, MemorySegment, int, MemorySegment)")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.returns(TypeName.INT)
.addParameter(MemorySegment_, "outPaths")
.addParameter(ClassName.get("overrungl.nfd", "NFD${variant.uppercaseName}FilterItem"), "filterList")
.addParameter(String::class.java, "defaultPath")
.beginControlFlow("try (MemoryStack stack = MemoryStack.pushLocal())")
.addStatement(
"return openDialogMultiple${variant.uppercaseName}(outPaths, Marshal.marshal(filterList), filterItemCount(filterList), Marshal.marshal(stack, defaultPath$1L))",
charset
)
.endControlFlow()
.build()
)
}
openDialogMultiple(Nchar, nfdCharset)
openDialogMultiple(U8char, "")

fun openDialogMultipleWith(variant: CharVariant) {
codeBuilder.add(
"$1L",
MethodSpec.methodBuilder("openDialogMultiple${variant.uppercaseName}With")
.addJavadoc("Overloads {@link #openDialogMultiple${variant.uppercaseName}With(MemorySegment, MemorySegment)")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.returns(TypeName.INT)
.addParameter(MemorySegment_, "outPaths")
.addParameter(ClassName.get("overrungl.nfd", "NFDOpenDialog${variant.uppercaseName}Args"), "args")
.addStatement("return openDialogMultiple${variant.uppercaseName}With(outPaths, Marshal.marshal(args))")
.build()
)
}
openDialogMultipleWith(Nchar)
openDialogMultipleWith(U8char)


fun saveDialog(variant: CharVariant, charset: String) {
codeBuilder.add(
"$1L",
MethodSpec.methodBuilder("saveDialog${variant.uppercaseName}")
.addJavadoc("Overloads {@link #saveDialog${variant.uppercaseName}(MemorySegment, MemorySegment, int, MemorySegment, MemorySegment)}")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.returns(TypeName.INT)
.addParameter(StringArray, "outPath")
.addParameter(ClassName.get("overrungl.nfd", "NFD${variant.uppercaseName}FilterItem"), "filterList")
.addParameter(String::class.java, "defaultPath")
.addParameter(String::class.java, "defaultName")
.beginControlFlow("try (MemoryStack stack = MemoryStack.pushLocal())")
.addStatement("var seg = Marshal.marshal(stack, outPath$1L)", charset)
.addStatement(
"int result = saveDialog${variant.uppercaseName}(seg, Marshal.marshal(filterList), filterItemCount(filterList), Marshal.marshal(stack, defaultPath$1L), Marshal.marshal(stack, defaultName$1L))",
charset
)
.beginControlFlow("if (result == OKAY)")
.addStatement("copyOutPath${variant.uppercaseName}(seg, outPath)")
.endControlFlow()
.addStatement("return result")
.endControlFlow()
.build()
)
}
saveDialog(Nchar, nfdCharset)
saveDialog(U8char, "")

fun saveDialogWith(variant: CharVariant, charset: String) {
codeBuilder.add(
"$1L",
MethodSpec.methodBuilder("saveDialog${variant.uppercaseName}With")
.addJavadoc("Overloads {@link #saveDialog${variant.uppercaseName}With(MemorySegment, MemorySegment)}")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.returns(TypeName.INT)
.addParameter(StringArray, "outPath")
.addParameter(ClassName.get("overrungl.nfd", "NFDSaveDialog${variant.uppercaseName}Args"), "args")
.beginControlFlow("try (MemoryStack stack = MemoryStack.pushLocal())")
.addStatement("var seg = Marshal.marshal(stack, outPath$1L)", charset)
.addStatement("int result = saveDialog${variant.uppercaseName}With(seg, Marshal.marshal(args))")
.beginControlFlow("if (result == OKAY)")
.addStatement("copyOutPath${variant.uppercaseName}(seg, outPath)")
.endControlFlow()
.addStatement("return result")
.endControlFlow()
.build()
)
}
saveDialogWith(Nchar, nfdCharset)
saveDialogWith(U8char, "")


fun pickFolder(variant: CharVariant, charset: String) {
codeBuilder.add(
"$1L",
MethodSpec.methodBuilder("pickFolder${variant.uppercaseName}")
.addJavadoc("Overloads {@link #pickFolder${variant.uppercaseName}(MemorySegment, MemorySegment)")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.returns(TypeName.INT)
.addParameter(StringArray, "outPath")
.addParameter(String::class.java, "defaultPath")
.beginControlFlow("try (MemoryStack stack = MemoryStack.pushLocal())")
.addStatement("var seg = Marshal.marshal(stack, outPath$1L)", charset)
.addStatement("int result = pickFolder${variant.uppercaseName}(seg, Marshal.marshal(stack, defaultPath$1L))", charset)
.beginControlFlow("if (result == OKAY)")
.addStatement("copyOutPath${variant.uppercaseName}(seg, outPath)")
.endControlFlow()
.addStatement("return result")
.endControlFlow()
.build()
)
}
pickFolder(Nchar, nfdCharset)
pickFolder(U8char, "")

Files.writeString(
path,
"${split[0]}$GENERATOR_BEGIN\n${
codeBuilder.build().toString().prependIndent(" ")
}\n $GENERATOR_END${split[2]}"
}$GENERATOR_END${split[2]}"
)
}
}
4 changes: 2 additions & 2 deletions generators/src/main/kotlin/overrungl/gen/Constants.kt
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,5 @@ copies or substantial portions of the Software.
This file is auto-generated. DO NOT EDIT!"""

const val GENERATOR_BEGIN = "// ---[BEGIN GENERATOR BEGIN]---"
const val GENERATOR_END = "// ---[END GENERATOR END]---"
const val GENERATOR_BEGIN = "//region ---[BEGIN GENERATOR BEGIN]---"
const val GENERATOR_END = "//endregion ---[END GENERATOR END]---"
18 changes: 12 additions & 6 deletions modules/overrungl.nfd/src/main/java/overrungl/nfd/CNFD.java
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,8 @@ public interface CNFD extends DirectAccess {
* <p>
* It's the caller's responsibility to free {@code outPath} via {@link #freePathN} if this function returns
* NFD_OKAY.
* @param filterCount If zero, filterList is ignored (you can use null).@param defaultPath If null, the operating system will decide.
* @param filterCount If zero, filterList is ignored (you can use null).
* @param defaultPath If null, the operating system will decide.
*/
@CType("nfdresult_t")
@Entrypoint("NFD_OpenDialogN")
Expand All @@ -117,7 +118,8 @@ int openDialogN(@CType("nfdnchar_t**") MemorySegment outPath,
* <p>
* It's the caller's responsibility to free {@code outPath} via {@link #freePathU8} if this function returns
* NFD_OKAY.
* @param filterCount If zero, filterList is ignored (you can use null).@param defaultPath If null, the operating system will decide.
* @param filterCount If zero, filterList is ignored (you can use null).
* @param defaultPath If null, the operating system will decide.
*/
@CType("nfdresult_t")
@Entrypoint("NFD_OpenDialogU8")
Expand Down Expand Up @@ -177,7 +179,8 @@ default int openDialogU8With(@CType("nfdu8char_t**") MemorySegment outPath,
* <p>
* It is the caller's responsibility to free {@code outPaths} via {@link #pathSetFree} if this function
* returns NFD_OKAY.
* @param filterCount If zero, filterList is ignored (you can use null).@param defaultPath If null, the operating system will decide.
* @param filterCount If zero, filterList is ignored (you can use null).
* @param defaultPath If null, the operating system will decide.
*/
@CType("nfdresult_t")
@Entrypoint("NFD_OpenDialogMultipleN")
Expand All @@ -191,7 +194,8 @@ int openDialogMultipleN(@CType("const nfdpathset_t**") MemorySegment outPaths,
* <p>
* It is the caller's responsibility to free {@code outPaths} via {@link #pathSetFree} if this function
* returns NFD_OKAY.
* @param filterCount If zero, filterList is ignored (you can use null).@param defaultPath If null, the operating system will decide.
* @param filterCount If zero, filterList is ignored (you can use null).
* @param defaultPath If null, the operating system will decide.
*/
@CType("nfdresult_t")
@Entrypoint("NFD_OpenDialogMultipleU8")
Expand Down Expand Up @@ -253,7 +257,8 @@ default int openDialogMultipleU8With(@CType("const nfdpathset_t**") MemorySegmen
* <p>
* It is the caller's responsibility to free {@code outPath} via {@link #freePathN} if this function returns
* NFD_OKAY.
* @param filterCount If zero, filterList is ignored (you can use null).@param defaultPath If null, the operating system will decide.
* @param filterCount If zero, filterList is ignored (you can use null).
* @param defaultPath If null, the operating system will decide.
*/
@CType("nfdresult_t")
@Entrypoint("NFD_SaveDialogN")
Expand All @@ -268,7 +273,8 @@ int saveDialogN(@CType("nfdnchar_t**") MemorySegment outPath,
* <p>
* It is the caller's responsibility to free {@code outPath} via {@link #freePathU8} if this function returns
* NFD_OKAY.
* @param filterCount If zero, filterList is ignored (you can use null).@param defaultPath If null, the operating system will decide.
* @param filterCount If zero, filterList is ignored (you can use null).
* @param defaultPath If null, the operating system will decide.
*/
@CType("nfdresult_t")
@Entrypoint("NFD_SaveDialogU8")
Expand Down
26 changes: 0 additions & 26 deletions modules/overrungl.nfd/src/main/java/overrungl/nfd/NFD.java
Original file line number Diff line number Diff line change
Expand Up @@ -174,32 +174,6 @@ default int openDialogN(String[] outPath, NFDNFilterItem filterList, String defa
}
}

/**
* Single file open dialog
*
* @param outPath the out path
* @param filterList the filter list
* @param defaultPath If null, the operating system will decide.
* @return the result
* @see #openDialogU8(MemorySegment, MemorySegment, int, MemorySegment) nopenDialogU8
*/
@Skip
default int openDialogU8(String[] outPath, NFDU8FilterItem filterList, String defaultPath) {
try (MemoryStack stack = MemoryStack.pushLocal()) {
final MemorySegment seg = Marshal.marshal(stack, outPath);
final int result = openDialogU8(seg,
Marshal.marshal(filterList),
filterList != null ? Math.toIntExact(filterList.elementCount()) : 0,
Marshal.marshal(stack, defaultPath, NFDInternal.nfdCharset));
if (result == OKAY) {
final MemorySegment path = seg.get(Unmarshal.STR_LAYOUT, 0L);
outPath[0] = path.getString(0L, NFDInternal.nfdCharset);
freePathU8(path);
}
return result;
}
}

/**
* Multiple file open dialog
*
Expand Down
Loading

0 comments on commit b5e46c5

Please sign in to comment.