xml-versioning-take-two-20090601
[openafs.git] / src / config / mkvers.c
index 949be9d..c022796 100644 (file)
  */
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <errno.h>
-#ifndef __APPLE_CC__
-#include <malloc.h>
-#endif
 #include <assert.h>
 #include <string.h>
 
 
-#define VERINFO_STRING_CHARS_MAX  950   /* max chars in verinfo string */
-#define CFILE_STRING_CHARS_MAX    2000  /* max chars in C file string */
+#define VERINFO_STRING_CHARS_MAX  950  /* max chars in verinfo string */
+#define CFILE_STRING_CHARS_MAX    2000 /* max chars in C file string */
 
-#define DEPTH_MAX  6  /* maximum depth of src dir search (>= 3) */
+#define DEPTH_MAX  6           /* maximum depth of src dir search (>= 3) */
 
-#define CMLDIR_DFLT   "../../src/CML"  /* default starting point for search */
+#define CMLDIR_DFLT   "../../src/CML"  /* default starting point for search */
 #define CMLDIR_BUFSZ  ((DEPTH_MAX * (sizeof("../") - 1)) + sizeof("src/CML"))
 static char cmldir[CMLDIR_BUFSZ];
 
@@ -60,29 +58,35 @@ int nStamps = 0;
 enum {
     CF_DEFAULT,
     CF_VERINFO,
-    CF_TEXT
+    CF_TEXT,
+    CF_XML
 } cfgFormat = CF_DEFAULT;
 
 char *programName;
 
 void PrintStamps(void);
 
-void Usage(void)
+void
+Usage(void)
 {
-    printf("Usage: %s [-d directory] [-o output file name] [-c component] [-v | -t]\n",
-          programName);
+    printf
+       ("Usage: %s [-d directory] [-o output file name] [-c component] [-v | -t | -x]\n",
+        programName);
     printf("%s creates the AFS_component_version_number.c file.\n",
           programName);
     printf("Options:\n");
     printf("-d directory - path of the CML directory, default is %s.\n",
           CMLDIR_DFLT);
     printf("-o file name - alternate output file name.\n");
-    printf("-c component - if not \"afs\" prefix for cml_version_number variable.\n");
+    printf
+       ("-c component - if not \"afs\" prefix for cml_version_number variable.\n");
     printf("-v generate NT versioninfo style declarations.\n");
     printf("-t generate text file style information.\n");
+    printf("-x generate XML revision information.\n");
     exit(1);
 }
 
+int
 main(int argc, char **argv)
 {
     char stampsFile[1024];
@@ -109,49 +113,51 @@ main(int argc, char **argv)
 
     programName = argv[0];
 
-    for (i=1; i<argc; i++) {
+    for (i = 1; i < argc; i++) {
        if (!strcmp("-d", argv[i])) {
-           i ++;
-           if (i>=argc || *argv[i] == '-') {
+           i++;
+           if (i >= argc || *argv[i] == '-') {
                printf("Missing directory name for -d option.\n");
                Usage();
            }
            baseDir = argv[i];
            argDir = 1;
-       }
-       else if (!strcmp("-o", argv[i])) {
-           i ++;
-           if (i>=argc || *argv[i] == '-') {
+       } else if (!strcmp("-o", argv[i])) {
+           i++;
+           if (i >= argc || *argv[i] == '-') {
                printf("Missing output file name for -o option.\n");
                Usage();
            }
            outputFile = argv[i];
-       }
-       else if (!strcmp("-c", argv[i])) {
-           i ++;
-           if (i>=argc || *argv[i] == '-') {
+       } else if (!strcmp("-c", argv[i])) {
+           i++;
+           if (i >= argc || *argv[i] == '-') {
                printf("Missing component for -c option.\n");
                Usage();
            }
            cml_prefix = argv[i];
-       }
-       else if (!strcmp("-v", argv[i])) {
+       } else if (!strcmp("-v", argv[i])) {
            if (cfgFormat == CF_DEFAULT || cfgFormat == CF_VERINFO) {
                cfgFormat = CF_VERINFO;
            } else {
                printf("Specify only one alternative output format\n");
                Usage();
            }
-       }
-       else if (!strcmp("-t", argv[i])) {
+       } else if (!strcmp("-t", argv[i])) {
            if (cfgFormat == CF_DEFAULT || cfgFormat == CF_TEXT) {
                cfgFormat = CF_TEXT;
            } else {
                printf("Specify only one alternative output format\n");
                Usage();
            }
-       }
-       else {
+       } else if (!strcmp("-x", argv[i])) {
+           if (cfgFormat == CF_DEFAULT || cfgFormat == CF_XML) {
+               cfgFormat = CF_XML;
+           } else {
+               printf("Specify only one alternative output format\n");
+               Usage();
+           }
+       } else {
            printf("%s: Unknown argument.\n", argv[i]);
            Usage();
        }
@@ -165,6 +171,8 @@ main(int argc, char **argv)
            strcat(outputFileBuf, ".h");
        } else if (cfgFormat == CF_TEXT) {
            strcat(outputFileBuf, ".txt");
+       } else if (cfgFormat == CF_XML) {
+           strcat(outputFileBuf, ".xml");
        } else {
            strcat(outputFileBuf, ".c");
        }
@@ -175,9 +183,8 @@ main(int argc, char **argv)
 
     if ((code = stat(outputFile, &sbuf)) < 0) {
        reBuild = 1;
-       versTime = (time_t)0; /* inidicates no output file. */
-    }
-    else {
+       versTime = (time_t) 0;  /* indicates no output file. */
+    } else {
        versTime = sbuf.st_mtime;
     }
 
@@ -202,22 +209,22 @@ main(int argc, char **argv)
        if (code == 0 && versTime <= sbuf.st_mtime)
            reBuild = 1;
     }
-       
+
     if (!reBuild) {
        printf("Not rebuilding %s since it is up to date.\n", outputFile);
        exit(0);
     }
 
     if (cml_prefix) {
-       cml_string = malloc(strlen("char ") +
-                           strlen(cml_prefix) + strlen(CML_STRING) + 1);
+       cml_string =
+           (char *)malloc(strlen("char ") + strlen(cml_prefix) + strlen(CML_STRING) +
+                  1);
        if (!cml_string) {
            printf("No space to use prefix in cml string, ignoring it.\n");
            cml_string = CML_VER_DECL;
-       }
-       else {
-           (void) sprintf(cml_string, "%s%s%s",
-                          "char ", cml_prefix, CML_STRING);
+       } else {
+           (void)sprintf(cml_string, "%s%s%s", "char ", cml_prefix,
+                         CML_STRING);
        }
     }
 
@@ -232,8 +239,7 @@ main(int argc, char **argv)
                        "%s \"No configuration information available\"\n",
                        VERINFO_BUILD_STRING);
            } else if (cfgFormat == CF_TEXT) {
-               fprintf(fpVers,
-                       "No configuration information available.\n");
+               fprintf(fpVers, "No configuration information available.\n");
            } else {
                fprintf(fpVers,
                        "%sNo configuration information available\";\n",
@@ -241,9 +247,8 @@ main(int argc, char **argv)
                fprintf(fpVers, "%safs??\";\n", AFS_STRING);
            }
            fclose(fpVers);
-       }
-       else {
-           fprintf(stderr,"Can't write version information to %s.\n",
+       } else {
+           fprintf(stderr, "Can't write version information to %s.\n",
                    outputFile);
        }
        fprintf(stderr,
@@ -256,11 +261,11 @@ main(int argc, char **argv)
     while (fgets(s, sizeof(s), fpState)) {
        if (*s == 'I' || *s == 'N' || *s == 'C' || *s == 'O') {
            stateDeltas[nStates].type = *s;
-           s[strlen(s)-1] = '\0';
-           (void) strcpy(stateDeltas[nStates].name, s+2);
-           nStates ++;
+           s[strlen(s) - 1] = '\0';
+           (void)strcpy(stateDeltas[nStates].name, s + 2);
+           nStates++;
        }
-       
+
     }
     fclose(fpState);
 
@@ -271,7 +276,8 @@ main(int argc, char **argv)
 }
 
 
-void PrintStamps(void)
+void
+PrintStamps(void)
 {
     char *s;
     char *c = NULL;
@@ -281,12 +287,12 @@ void PrintStamps(void)
     if (cfgFormat == CF_VERINFO) {
        outMax = VERINFO_STRING_CHARS_MAX;
     } else if (cfgFormat == CF_TEXT) {
-       outMax = 0;  /* signifies that there is no maximum */
+       outMax = 0;             /* signifies that there is no maximum */
     } else {
        outMax = CFILE_STRING_CHARS_MAX;
     }
 
-    for (i=0; i<nStates; i++) {
+    for (i = 0; i < nStates; i++) {
        if (stateDeltas[i].type == 'C') {
            if (cfgFormat == CF_VERINFO) {
                fprintf(fpVers, "%s \"Base configuration %s",
@@ -294,16 +300,24 @@ void PrintStamps(void)
            } else if (cfgFormat == CF_TEXT) {
                fprintf(fpVers, "Base configuration %s\n",
                        stateDeltas[i].name);
+           } else if (cfgFormat == CF_XML) {
+                fprintf(fpVers, 
+                        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+                        "<revision>\n"
+                        "<revnumber>\n"
+                        "Base configuration %s\n"
+                        "</revnumber>\n",
+                       stateDeltas[i].name);
            } else {
-               fprintf(fpVers, "%sBase configuration %s",
-                       cml_string, stateDeltas[i].name);
+               fprintf(fpVers, "%sBase configuration %s", cml_string,
+                       stateDeltas[i].name);
            }
            c = stateDeltas[i].name;
            break;
        }
     }
 
-    for (i=0; i<nStates; i++) {
+    for (i = 0; i < nStates; i++) {
        if (stateDeltas[i].type == 'I' || stateDeltas[i].type == 'N') {
            outCount += strlen(stateDeltas[i].name) + 2;
            if (outMax && outCount > outMax) {
@@ -312,6 +326,13 @@ void PrintStamps(void)
            if (cfgFormat == CF_TEXT) {
                fprintf(fpVers, "%c%s\n", stateDeltas[i].type,
                        stateDeltas[i].name);
+           } else if (cfgFormat == CF_XML) {
+               fprintf(fpVers, 
+                        "<revremark>\n"
+                        ";%c%s"
+                         "</revremark>\n",
+                        stateDeltas[i].type,
+                       stateDeltas[i].name);
            } else {
                fprintf(fpVers, ";%c%s", stateDeltas[i].type,
                        stateDeltas[i].name);
@@ -319,7 +340,7 @@ void PrintStamps(void)
        }
     }
 
-    for (i=0; i<nStates; i++) {
+    for (i = 0; i < nStates; i++) {
        if (stateDeltas[i].type == 'O') {
            outCount += strlen(stateDeltas[i].name) + 2;
            if (outMax && outCount > outMax) {
@@ -328,6 +349,13 @@ void PrintStamps(void)
            if (cfgFormat == CF_TEXT) {
                fprintf(fpVers, "%c%s\n", stateDeltas[i].type,
                        stateDeltas[i].name);
+           } else if (cfgFormat == CF_XML) {
+               fprintf(fpVers, 
+                        "<revremark>\n"
+                        ";%c%s"
+                         "</revremark>\n",
+                        stateDeltas[i].type,
+                       stateDeltas[i].name);
            } else {
                fprintf(fpVers, ";%c%s", stateDeltas[i].type,
                        stateDeltas[i].name);
@@ -346,9 +374,11 @@ void PrintStamps(void)
 
        if (c)
            c += 3;
-       s = (char*)strchr(c, ' ');
+       s = (char *)strchr(c, ' ');
        if (s)
            *s = '\0';
        fprintf(fpVers, "%s%s\";\n", AFS_STRING, c ? c : "Unknown");
+    } else if (cfgFormat == CF_XML) {
+        fprintf(fpVers, "</revision>\n");
     }
 }