Fossil SCM

Refactored ATTACHMENT crosslinking a bit to remove some duplicate code (tested on libfossil repo). Replaced free() with fossil_free() (consistency). Added fossil_is_uuid(), the c-string counterpart of blob_is_uuid().

stephan 2014-04-11 15:44 trunk
Commit b7ff537dca972087d412c527681598d49e70da76
2 files changed +28 -34 +10
+28 -34
--- src/manifest.c
+++ src/manifest.c
@@ -135,16 +135,16 @@
135135
** Clear the memory allocated in a manifest object
136136
*/
137137
void manifest_destroy(Manifest *p){
138138
if( p ){
139139
blob_reset(&p->content);
140
- free(p->aFile);
141
- free(p->azParent);
142
- free(p->azCChild);
143
- free(p->aTag);
144
- free(p->aField);
145
- free(p->aCherrypick);
140
+ fossil_free(p->aFile);
141
+ fossil_free(p->azParent);
142
+ fossil_free(p->azCChild);
143
+ fossil_free(p->aTag);
144
+ fossil_free(p->aField);
145
+ fossil_free(p->aCherrypick);
146146
if( p->pBaseline ) manifest_destroy(p->pBaseline);
147147
memset(p, 0, sizeof(*p));
148148
fossil_free(p);
149149
}
150150
}
@@ -1608,11 +1608,11 @@
16081608
blob_appendf(&comment, "Ticket [%s|%.10s] <i>%h</i> status still %h with "
16091609
"%d other change%s",
16101610
pManifest->zTicketUuid, pManifest->zTicketUuid, zTitle, zNewStatus,
16111611
pManifest->nField, pManifest->nField==1 ? "" : "s"
16121612
);
1613
- free(zNewStatus);
1613
+ fossil_free(zNewStatus);
16141614
blob_appendf(&brief, "Ticket [%s|%.10s]: %d change%s",
16151615
pManifest->zTicketUuid, pManifest->zTicketUuid, pManifest->nField,
16161616
pManifest->nField==1 ? "" : "s"
16171617
);
16181618
}
@@ -1621,11 +1621,11 @@
16211621
pManifest->zTicketUuid, pManifest->zTicketUuid, zTitle
16221622
);
16231623
blob_appendf(&brief, "New ticket [%s|%.10s].", pManifest->zTicketUuid,
16241624
pManifest->zTicketUuid);
16251625
}
1626
- free(zTitle);
1626
+ fossil_free(zTitle);
16271627
db_multi_exec(
16281628
"REPLACE INTO event(type,tagid,mtime,objid,user,comment,brief)"
16291629
"VALUES('t',%d,%.17g,%d,%Q,%Q,%Q)",
16301630
tktTagId, pManifest->rDate, rid, pManifest->zUser,
16311631
blob_str(&comment), blob_str(&brief)
@@ -1753,11 +1753,11 @@
17531753
TAG_COMMENT, rid, p->rDate
17541754
);
17551755
zCom = db_text(0, "SELECT coalesce(ecomment, comment) FROM event"
17561756
" WHERE rowid=last_insert_rowid()");
17571757
wiki_extract_links(zCom, rid, 0, p->rDate, 1, WIKI_INLINE);
1758
- free(zCom);
1758
+ fossil_free(zCom);
17591759
17601760
/* If this is a delta-manifest, record the fact that this repository
17611761
** contains delta manifests, to free the "commit" logic to generate
17621762
** new delta manifests.
17631763
*/
@@ -1822,11 +1822,11 @@
18221822
char zLength[40];
18231823
while( fossil_isspace(p->zWiki[0]) ) p->zWiki++;
18241824
nWiki = strlen(p->zWiki);
18251825
sqlite3_snprintf(sizeof(zLength), zLength, "%d", nWiki);
18261826
tag_insert(zTag, 1, zLength, rid, p->rDate, rid);
1827
- free(zTag);
1827
+ fossil_free(zTag);
18281828
prior = db_int(0,
18291829
"SELECT rid FROM tagxref"
18301830
" WHERE tagid=%d AND mtime<%.17g"
18311831
" ORDER BY mtime DESC",
18321832
tagid, p->rDate
@@ -1850,11 +1850,11 @@
18501850
TAG_BGCOLOR, rid,
18511851
TAG_BGCOLOR, rid,
18521852
TAG_USER, rid,
18531853
TAG_COMMENT, rid
18541854
);
1855
- free(zComment);
1855
+ fossil_free(zComment);
18561856
}
18571857
if( p->type==CFTYPE_EVENT ){
18581858
char *zTag = mprintf("event-%s", p->zEventId);
18591859
int tagid = tag_findid(zTag, 1);
18601860
int prior, subsequent;
@@ -1862,11 +1862,11 @@
18621862
char zLength[40];
18631863
while( fossil_isspace(p->zWiki[0]) ) p->zWiki++;
18641864
nWiki = strlen(p->zWiki);
18651865
sqlite3_snprintf(sizeof(zLength), zLength, "%d", nWiki);
18661866
tag_insert(zTag, 1, zLength, rid, p->rDate, rid);
1867
- free(zTag);
1867
+ fossil_free(zTag);
18681868
prior = db_int(0,
18691869
"SELECT rid FROM tagxref"
18701870
" WHERE tagid=%d AND mtime<%.17g AND rid!=%d"
18711871
" ORDER BY mtime DESC",
18721872
tagid, p->rDate, rid
@@ -1901,22 +1901,26 @@
19011901
);
19021902
}
19031903
}
19041904
if( p->type==CFTYPE_TICKET ){
19051905
char *zTag;
1906
-
19071906
assert( manifest_crosslink_busy==1 );
19081907
zTag = mprintf("tkt-%s", p->zTicketUuid);
19091908
tag_insert(zTag, 1, 0, rid, p->rDate, rid);
1910
- free(zTag);
1909
+ fossil_free(zTag);
19111910
db_multi_exec("INSERT OR IGNORE INTO pending_tkt VALUES(%Q)",
19121911
p->zTicketUuid);
19131912
}
19141913
if( p->type==CFTYPE_ATTACHMENT ){
1914
+ char *zComment = 0;
1915
+ char const isAdd = (p->zAttachSrc && p->zAttachSrc[0]) ? 1 : 0;
1916
+ char const attachToType = fossil_is_uuid(p->zAttachTarget)
1917
+ ? 't' /* attach to ticket */
1918
+ : 'w' /* attach to wiki page */;
19151919
db_multi_exec(
19161920
"INSERT INTO attachment(attachid, mtime, src, target,"
1917
- "filename, comment, user)"
1921
+ "filename, comment, user)"
19181922
"VALUES(%d,%.17g,%Q,%Q,%Q,%Q,%Q);",
19191923
rid, p->rDate, p->zAttachSrc, p->zAttachTarget, p->zAttachName,
19201924
(p->zComment ? p->zComment : ""), p->zUser
19211925
);
19221926
db_multi_exec(
@@ -1925,45 +1929,35 @@
19251929
" WHERE target=%Q AND filename=%Q))"
19261930
" WHERE target=%Q AND filename=%Q",
19271931
p->zAttachTarget, p->zAttachName,
19281932
p->zAttachTarget, p->zAttachName
19291933
);
1930
- if( strlen(p->zAttachTarget)!=UUID_SIZE
1931
- || !validate16(p->zAttachTarget, UUID_SIZE)
1932
- ){
1933
- char *zComment;
1934
- if( p->zAttachSrc && p->zAttachSrc[0] ){
1934
+ if( 'w' == attachToType ){
1935
+ if( isAdd ){
19351936
zComment = mprintf(
19361937
"Add attachment [/artifact/%s|%h] to wiki page [%h]",
19371938
p->zAttachSrc, p->zAttachName, p->zAttachTarget);
19381939
}else{
19391940
zComment = mprintf("Delete attachment \"%h\" from wiki page [%h]",
19401941
p->zAttachName, p->zAttachTarget);
19411942
}
1942
- db_multi_exec(
1943
- "REPLACE INTO event(type,mtime,objid,user,comment)"
1944
- "VALUES('w',%.17g,%d,%Q,%Q)",
1945
- p->rDate, rid, p->zUser, zComment
1946
- );
1947
- free(zComment);
19481943
}else{
1949
- char *zComment;
1950
- if( p->zAttachSrc && p->zAttachSrc[0] ){
1944
+ if( isAdd ){
19511945
zComment = mprintf(
19521946
"Add attachment [/artifact/%s|%h] to ticket [%s|%.10s]",
19531947
p->zAttachSrc, p->zAttachName, p->zAttachTarget, p->zAttachTarget);
19541948
}else{
19551949
zComment = mprintf("Delete attachment \"%h\" from ticket [%s|%.10s]",
19561950
p->zAttachName, p->zAttachTarget, p->zAttachTarget);
19571951
}
1958
- db_multi_exec(
1952
+ }
1953
+ db_multi_exec(
19591954
"REPLACE INTO event(type,mtime,objid,user,comment)"
1960
- "VALUES('t',%.17g,%d,%Q,%Q)",
1961
- p->rDate, rid, p->zUser, zComment
1962
- );
1963
- free(zComment);
1964
- }
1955
+ "VALUES('%c',%.17g,%d,%Q,%Q)",
1956
+ attachToType, p->rDate, rid, p->zUser, zComment
1957
+ );
1958
+ fossil_free(zComment);
19651959
}
19661960
if( p->type==CFTYPE_CONTROL ){
19671961
Blob comment;
19681962
int i;
19691963
const char *zName;
19701964
--- src/manifest.c
+++ src/manifest.c
@@ -135,16 +135,16 @@
135 ** Clear the memory allocated in a manifest object
136 */
137 void manifest_destroy(Manifest *p){
138 if( p ){
139 blob_reset(&p->content);
140 free(p->aFile);
141 free(p->azParent);
142 free(p->azCChild);
143 free(p->aTag);
144 free(p->aField);
145 free(p->aCherrypick);
146 if( p->pBaseline ) manifest_destroy(p->pBaseline);
147 memset(p, 0, sizeof(*p));
148 fossil_free(p);
149 }
150 }
@@ -1608,11 +1608,11 @@
1608 blob_appendf(&comment, "Ticket [%s|%.10s] <i>%h</i> status still %h with "
1609 "%d other change%s",
1610 pManifest->zTicketUuid, pManifest->zTicketUuid, zTitle, zNewStatus,
1611 pManifest->nField, pManifest->nField==1 ? "" : "s"
1612 );
1613 free(zNewStatus);
1614 blob_appendf(&brief, "Ticket [%s|%.10s]: %d change%s",
1615 pManifest->zTicketUuid, pManifest->zTicketUuid, pManifest->nField,
1616 pManifest->nField==1 ? "" : "s"
1617 );
1618 }
@@ -1621,11 +1621,11 @@
1621 pManifest->zTicketUuid, pManifest->zTicketUuid, zTitle
1622 );
1623 blob_appendf(&brief, "New ticket [%s|%.10s].", pManifest->zTicketUuid,
1624 pManifest->zTicketUuid);
1625 }
1626 free(zTitle);
1627 db_multi_exec(
1628 "REPLACE INTO event(type,tagid,mtime,objid,user,comment,brief)"
1629 "VALUES('t',%d,%.17g,%d,%Q,%Q,%Q)",
1630 tktTagId, pManifest->rDate, rid, pManifest->zUser,
1631 blob_str(&comment), blob_str(&brief)
@@ -1753,11 +1753,11 @@
1753 TAG_COMMENT, rid, p->rDate
1754 );
1755 zCom = db_text(0, "SELECT coalesce(ecomment, comment) FROM event"
1756 " WHERE rowid=last_insert_rowid()");
1757 wiki_extract_links(zCom, rid, 0, p->rDate, 1, WIKI_INLINE);
1758 free(zCom);
1759
1760 /* If this is a delta-manifest, record the fact that this repository
1761 ** contains delta manifests, to free the "commit" logic to generate
1762 ** new delta manifests.
1763 */
@@ -1822,11 +1822,11 @@
1822 char zLength[40];
1823 while( fossil_isspace(p->zWiki[0]) ) p->zWiki++;
1824 nWiki = strlen(p->zWiki);
1825 sqlite3_snprintf(sizeof(zLength), zLength, "%d", nWiki);
1826 tag_insert(zTag, 1, zLength, rid, p->rDate, rid);
1827 free(zTag);
1828 prior = db_int(0,
1829 "SELECT rid FROM tagxref"
1830 " WHERE tagid=%d AND mtime<%.17g"
1831 " ORDER BY mtime DESC",
1832 tagid, p->rDate
@@ -1850,11 +1850,11 @@
1850 TAG_BGCOLOR, rid,
1851 TAG_BGCOLOR, rid,
1852 TAG_USER, rid,
1853 TAG_COMMENT, rid
1854 );
1855 free(zComment);
1856 }
1857 if( p->type==CFTYPE_EVENT ){
1858 char *zTag = mprintf("event-%s", p->zEventId);
1859 int tagid = tag_findid(zTag, 1);
1860 int prior, subsequent;
@@ -1862,11 +1862,11 @@
1862 char zLength[40];
1863 while( fossil_isspace(p->zWiki[0]) ) p->zWiki++;
1864 nWiki = strlen(p->zWiki);
1865 sqlite3_snprintf(sizeof(zLength), zLength, "%d", nWiki);
1866 tag_insert(zTag, 1, zLength, rid, p->rDate, rid);
1867 free(zTag);
1868 prior = db_int(0,
1869 "SELECT rid FROM tagxref"
1870 " WHERE tagid=%d AND mtime<%.17g AND rid!=%d"
1871 " ORDER BY mtime DESC",
1872 tagid, p->rDate, rid
@@ -1901,22 +1901,26 @@
1901 );
1902 }
1903 }
1904 if( p->type==CFTYPE_TICKET ){
1905 char *zTag;
1906
1907 assert( manifest_crosslink_busy==1 );
1908 zTag = mprintf("tkt-%s", p->zTicketUuid);
1909 tag_insert(zTag, 1, 0, rid, p->rDate, rid);
1910 free(zTag);
1911 db_multi_exec("INSERT OR IGNORE INTO pending_tkt VALUES(%Q)",
1912 p->zTicketUuid);
1913 }
1914 if( p->type==CFTYPE_ATTACHMENT ){
 
 
 
 
 
1915 db_multi_exec(
1916 "INSERT INTO attachment(attachid, mtime, src, target,"
1917 "filename, comment, user)"
1918 "VALUES(%d,%.17g,%Q,%Q,%Q,%Q,%Q);",
1919 rid, p->rDate, p->zAttachSrc, p->zAttachTarget, p->zAttachName,
1920 (p->zComment ? p->zComment : ""), p->zUser
1921 );
1922 db_multi_exec(
@@ -1925,45 +1929,35 @@
1925 " WHERE target=%Q AND filename=%Q))"
1926 " WHERE target=%Q AND filename=%Q",
1927 p->zAttachTarget, p->zAttachName,
1928 p->zAttachTarget, p->zAttachName
1929 );
1930 if( strlen(p->zAttachTarget)!=UUID_SIZE
1931 || !validate16(p->zAttachTarget, UUID_SIZE)
1932 ){
1933 char *zComment;
1934 if( p->zAttachSrc && p->zAttachSrc[0] ){
1935 zComment = mprintf(
1936 "Add attachment [/artifact/%s|%h] to wiki page [%h]",
1937 p->zAttachSrc, p->zAttachName, p->zAttachTarget);
1938 }else{
1939 zComment = mprintf("Delete attachment \"%h\" from wiki page [%h]",
1940 p->zAttachName, p->zAttachTarget);
1941 }
1942 db_multi_exec(
1943 "REPLACE INTO event(type,mtime,objid,user,comment)"
1944 "VALUES('w',%.17g,%d,%Q,%Q)",
1945 p->rDate, rid, p->zUser, zComment
1946 );
1947 free(zComment);
1948 }else{
1949 char *zComment;
1950 if( p->zAttachSrc && p->zAttachSrc[0] ){
1951 zComment = mprintf(
1952 "Add attachment [/artifact/%s|%h] to ticket [%s|%.10s]",
1953 p->zAttachSrc, p->zAttachName, p->zAttachTarget, p->zAttachTarget);
1954 }else{
1955 zComment = mprintf("Delete attachment \"%h\" from ticket [%s|%.10s]",
1956 p->zAttachName, p->zAttachTarget, p->zAttachTarget);
1957 }
1958 db_multi_exec(
 
1959 "REPLACE INTO event(type,mtime,objid,user,comment)"
1960 "VALUES('t',%.17g,%d,%Q,%Q)",
1961 p->rDate, rid, p->zUser, zComment
1962 );
1963 free(zComment);
1964 }
1965 }
1966 if( p->type==CFTYPE_CONTROL ){
1967 Blob comment;
1968 int i;
1969 const char *zName;
1970
--- src/manifest.c
+++ src/manifest.c
@@ -135,16 +135,16 @@
135 ** Clear the memory allocated in a manifest object
136 */
137 void manifest_destroy(Manifest *p){
138 if( p ){
139 blob_reset(&p->content);
140 fossil_free(p->aFile);
141 fossil_free(p->azParent);
142 fossil_free(p->azCChild);
143 fossil_free(p->aTag);
144 fossil_free(p->aField);
145 fossil_free(p->aCherrypick);
146 if( p->pBaseline ) manifest_destroy(p->pBaseline);
147 memset(p, 0, sizeof(*p));
148 fossil_free(p);
149 }
150 }
@@ -1608,11 +1608,11 @@
1608 blob_appendf(&comment, "Ticket [%s|%.10s] <i>%h</i> status still %h with "
1609 "%d other change%s",
1610 pManifest->zTicketUuid, pManifest->zTicketUuid, zTitle, zNewStatus,
1611 pManifest->nField, pManifest->nField==1 ? "" : "s"
1612 );
1613 fossil_free(zNewStatus);
1614 blob_appendf(&brief, "Ticket [%s|%.10s]: %d change%s",
1615 pManifest->zTicketUuid, pManifest->zTicketUuid, pManifest->nField,
1616 pManifest->nField==1 ? "" : "s"
1617 );
1618 }
@@ -1621,11 +1621,11 @@
1621 pManifest->zTicketUuid, pManifest->zTicketUuid, zTitle
1622 );
1623 blob_appendf(&brief, "New ticket [%s|%.10s].", pManifest->zTicketUuid,
1624 pManifest->zTicketUuid);
1625 }
1626 fossil_free(zTitle);
1627 db_multi_exec(
1628 "REPLACE INTO event(type,tagid,mtime,objid,user,comment,brief)"
1629 "VALUES('t',%d,%.17g,%d,%Q,%Q,%Q)",
1630 tktTagId, pManifest->rDate, rid, pManifest->zUser,
1631 blob_str(&comment), blob_str(&brief)
@@ -1753,11 +1753,11 @@
1753 TAG_COMMENT, rid, p->rDate
1754 );
1755 zCom = db_text(0, "SELECT coalesce(ecomment, comment) FROM event"
1756 " WHERE rowid=last_insert_rowid()");
1757 wiki_extract_links(zCom, rid, 0, p->rDate, 1, WIKI_INLINE);
1758 fossil_free(zCom);
1759
1760 /* If this is a delta-manifest, record the fact that this repository
1761 ** contains delta manifests, to free the "commit" logic to generate
1762 ** new delta manifests.
1763 */
@@ -1822,11 +1822,11 @@
1822 char zLength[40];
1823 while( fossil_isspace(p->zWiki[0]) ) p->zWiki++;
1824 nWiki = strlen(p->zWiki);
1825 sqlite3_snprintf(sizeof(zLength), zLength, "%d", nWiki);
1826 tag_insert(zTag, 1, zLength, rid, p->rDate, rid);
1827 fossil_free(zTag);
1828 prior = db_int(0,
1829 "SELECT rid FROM tagxref"
1830 " WHERE tagid=%d AND mtime<%.17g"
1831 " ORDER BY mtime DESC",
1832 tagid, p->rDate
@@ -1850,11 +1850,11 @@
1850 TAG_BGCOLOR, rid,
1851 TAG_BGCOLOR, rid,
1852 TAG_USER, rid,
1853 TAG_COMMENT, rid
1854 );
1855 fossil_free(zComment);
1856 }
1857 if( p->type==CFTYPE_EVENT ){
1858 char *zTag = mprintf("event-%s", p->zEventId);
1859 int tagid = tag_findid(zTag, 1);
1860 int prior, subsequent;
@@ -1862,11 +1862,11 @@
1862 char zLength[40];
1863 while( fossil_isspace(p->zWiki[0]) ) p->zWiki++;
1864 nWiki = strlen(p->zWiki);
1865 sqlite3_snprintf(sizeof(zLength), zLength, "%d", nWiki);
1866 tag_insert(zTag, 1, zLength, rid, p->rDate, rid);
1867 fossil_free(zTag);
1868 prior = db_int(0,
1869 "SELECT rid FROM tagxref"
1870 " WHERE tagid=%d AND mtime<%.17g AND rid!=%d"
1871 " ORDER BY mtime DESC",
1872 tagid, p->rDate, rid
@@ -1901,22 +1901,26 @@
1901 );
1902 }
1903 }
1904 if( p->type==CFTYPE_TICKET ){
1905 char *zTag;
 
1906 assert( manifest_crosslink_busy==1 );
1907 zTag = mprintf("tkt-%s", p->zTicketUuid);
1908 tag_insert(zTag, 1, 0, rid, p->rDate, rid);
1909 fossil_free(zTag);
1910 db_multi_exec("INSERT OR IGNORE INTO pending_tkt VALUES(%Q)",
1911 p->zTicketUuid);
1912 }
1913 if( p->type==CFTYPE_ATTACHMENT ){
1914 char *zComment = 0;
1915 char const isAdd = (p->zAttachSrc && p->zAttachSrc[0]) ? 1 : 0;
1916 char const attachToType = fossil_is_uuid(p->zAttachTarget)
1917 ? 't' /* attach to ticket */
1918 : 'w' /* attach to wiki page */;
1919 db_multi_exec(
1920 "INSERT INTO attachment(attachid, mtime, src, target,"
1921 "filename, comment, user)"
1922 "VALUES(%d,%.17g,%Q,%Q,%Q,%Q,%Q);",
1923 rid, p->rDate, p->zAttachSrc, p->zAttachTarget, p->zAttachName,
1924 (p->zComment ? p->zComment : ""), p->zUser
1925 );
1926 db_multi_exec(
@@ -1925,45 +1929,35 @@
1929 " WHERE target=%Q AND filename=%Q))"
1930 " WHERE target=%Q AND filename=%Q",
1931 p->zAttachTarget, p->zAttachName,
1932 p->zAttachTarget, p->zAttachName
1933 );
1934 if( 'w' == attachToType ){
1935 if( isAdd ){
 
 
 
1936 zComment = mprintf(
1937 "Add attachment [/artifact/%s|%h] to wiki page [%h]",
1938 p->zAttachSrc, p->zAttachName, p->zAttachTarget);
1939 }else{
1940 zComment = mprintf("Delete attachment \"%h\" from wiki page [%h]",
1941 p->zAttachName, p->zAttachTarget);
1942 }
 
 
 
 
 
 
1943 }else{
1944 if( isAdd ){
 
1945 zComment = mprintf(
1946 "Add attachment [/artifact/%s|%h] to ticket [%s|%.10s]",
1947 p->zAttachSrc, p->zAttachName, p->zAttachTarget, p->zAttachTarget);
1948 }else{
1949 zComment = mprintf("Delete attachment \"%h\" from ticket [%s|%.10s]",
1950 p->zAttachName, p->zAttachTarget, p->zAttachTarget);
1951 }
1952 }
1953 db_multi_exec(
1954 "REPLACE INTO event(type,mtime,objid,user,comment)"
1955 "VALUES('%c',%.17g,%d,%Q,%Q)",
1956 attachToType, p->rDate, rid, p->zUser, zComment
1957 );
1958 fossil_free(zComment);
 
1959 }
1960 if( p->type==CFTYPE_CONTROL ){
1961 Blob comment;
1962 int i;
1963 const char *zName;
1964
+10
--- src/util.c
+++ src/util.c
@@ -312,5 +312,15 @@
312312
return 1;
313313
#else
314314
return fcntl(fd, F_GETFL)!=(-1) || errno!=EBADF;
315315
#endif
316316
}
317
+
318
+/*
319
+** Returns TRUE if zSym is exactly UUID_SIZE bytes long and contains
320
+** only lower-case ASCII hexadecimal values.
321
+*/
322
+int fossil_is_uuid(char const * zSym){
323
+ return zSym
324
+ && (UUID_SIZE==strlen(zSym))
325
+ && validate16(zSym, UUID_SIZE);
326
+}
317327
--- src/util.c
+++ src/util.c
@@ -312,5 +312,15 @@
312 return 1;
313 #else
314 return fcntl(fd, F_GETFL)!=(-1) || errno!=EBADF;
315 #endif
316 }
 
 
 
 
 
 
 
 
 
 
317
--- src/util.c
+++ src/util.c
@@ -312,5 +312,15 @@
312 return 1;
313 #else
314 return fcntl(fd, F_GETFL)!=(-1) || errno!=EBADF;
315 #endif
316 }
317
318 /*
319 ** Returns TRUE if zSym is exactly UUID_SIZE bytes long and contains
320 ** only lower-case ASCII hexadecimal values.
321 */
322 int fossil_is_uuid(char const * zSym){
323 return zSym
324 && (UUID_SIZE==strlen(zSym))
325 && validate16(zSym, UUID_SIZE);
326 }
327

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button