/* * Project name: Java kSOAP2 KvmSerializable Generator * Author: Isaac Good * Summary: Creates a KvmSerializable Java class for use with kSOAP2 * Variable types currently supported: - int - String * * Example input: myClass int counter int number String name * * Project start/end: * August 08, '06 * * This is under the MIT license like the rest of my software. See http://www.ecf.utoronto.ca/~goodi/html/software.html for the license. */ #include #include #include // Input Data struct. Class name, array of variable names + types and nunber of variables typedef struct { int size; char **vars; char **varType; char * className; } InputData; // This is the 'on error' function InputData doErr (void) { InputData i; printf("Error. Usage: "); i.size = 0; return i; } // Check validity of input types int invalidType(char * s) { int i; i = 1; i &= strcmp(s, "int"); i &= strcmp(s, "String"); if (i) printf("Invalid type: %s\n", s); return i; } // Reads in input from stdio and checks all types are valid. InputData getInputData (void) { InputData in; char buffer[128]; in.size = 0; if(scanf("%s", buffer) != 1) return doErr(); in.className = malloc(strlen(buffer)); strcpy(in.className, buffer); in.vars = NULL; in.varType = NULL; while(scanf("%s", buffer) == 1) { // Pull var type if (invalidType(buffer)) return doErr(); in.varType = realloc(in.varType, sizeof(char*) * (in.size + 1)); in.varType[in.size] = malloc(strlen(buffer) + 1); strcpy(in.varType[in.size], buffer); // Pull var name if(scanf("%s", buffer) != 1) return doErr(); in.vars = realloc(in.vars, sizeof(char*) * (in.size + 1)); in.vars[in.size] = malloc(strlen(buffer) + 1); strcpy(in.vars[in.size], buffer); in.size++; } return in; } // Creates the static-type name, e.g. myVar converts to MY_VAR char * toStatic (char * name) { char * t; int i, j; t = malloc(strlen(name) + 1); for (i = j = 0; i < strlen(name); i++, j++) { if (name[i] >= 'a' && name[i] <= 'z') t[j] = name[i] - 32; else if (name[i] >= 'A' && name[i] <= 'Z') { t = realloc(t, strlen(name) + 1 + j - i + 1); t[j] = 95; // '_' j++; t[j] = name[i]; } else t[j] = '?'; } t[j] = NULL; return t; } void makeOutput(InputData in) { int i; char * t; // Misc printf("import java.util.Hashtable;\n"); printf("import org.ksoap2.serialization.KvmSerializable;\n"); printf("import org.ksoap2.serialization.PropertyInfo;\n\n"); // Output class name printf("public class %s implements KvmSerializable {\n", in.className); // Output variables for (i = 0; i < in.size; i++) printf("\tprivate %s %s;\n", in.varType[i], in.vars[i]); printf("\n"); // Statics for (i = 0; i < in.size; i++) { t = toStatic(in.vars[i]); printf("\tpublic static final int %s = %d;\n", t, i); free(t); } printf("\n"); // Count printf("\tpublic int getPropertyCount() { return %d; }\n\n", in.size); // Gets printf("\tpublic Object getProperty(int index) {\n"); printf("\t\tswitch (index) {\n"); for (i = 0; i < in.size; i++) { t = toStatic(in.vars[i]); if (strcmp(in.varType[i], "String") == 0) printf ("\t\tcase %s: return %s;\n", t, in.vars[i]); else if (strcmp(in.varType[i], "int") == 0) printf ("\t\tcase %s: return new Integer(%s);\n", t, in.vars[i]); free(t); } printf("\t\tdefault: throw new RuntimeException(\"property not found \"+ index);\n\t\t}\n\t}\n\n"); // Sets printf("\tpublic void setProperty(int index, Object o) {\n"); printf("\t\tswitch (index) {\n"); for (i = 0; i < in.size; i++) { t = toStatic(in.vars[i]); printf ("\t\tcase %s: ", t); free(t); if (strcmp(in.varType[i], "String") == 0) printf ("%s = o.toString(); break;\n", in.vars[i]); else if (strcmp(in.varType[i], "int") == 0) printf ("%s = ((Integer)o).intValue(); break;\n", in.vars[i]); } printf("\t\tdefault: throw new RuntimeException(\"property not found \"+ index);\n\t\t}\n\t}\n\n"); // Property Info printf("\tpublic void getPropertyInfo(int index, Hashtable arg1, PropertyInfo info) {\n"); printf("\t\tswitch (index) {\n"); for (i = 0; i < in.size; i++) { t = toStatic(in.vars[i]); printf ("\t\tcase %s:\n", t); printf("\t\t\tinfo.name = \"%s\";\n", in.vars[i]); printf("\t\t\tinfo.type = "); free(t); if (strcmp(in.varType[i], "String") == 0) printf ("PropertyInfo.STRING_CLASS;\n"); else if (strcmp(in.varType[i], "int") == 0) printf ("PropertyInfo.INTEGER_CLASS;\n"); printf("\t\t\tbreak;\n"); } printf("\t\tdefault: throw new RuntimeException(\"property not found \"+ index);\n\t\t}\n\t}\n"); printf("}"); return; } int main (void) { InputData in; in = getInputData(); if (in.size == 0) return 1; makeOutput(in); return 0; }