]> granicus.if.org Git - graphviz/commitdiff
Fix graph reader function to do minimal copying and work with utf-8.
authorerg <devnull@localhost>
Wed, 2 Mar 2011 21:45:05 +0000 (21:45 +0000)
committererg <devnull@localhost>
Wed, 2 Mar 2011 21:45:05 +0000 (21:45 +0000)
cmd/gvedit/csettings.cpp
cmd/gvedit/csettings.h

index 291e0e4fbfd559eebc46b227aeca016a465f4d83..13c6b16599c4c3421604bb39cf4317aa28e23a96 100644 (file)
 #include "string.h"
 #define WIDGET(t,f)  ((t*)findChild<t *>(#f))
 
+typedef struct {
+    const char* data;
+    int len;
+    int cur;
+} rdr_t;
 
 bool loadAttrs(const QString fileName,QComboBox* cbNameG,QComboBox* cbNameN,QComboBox* cbNameE)
 {
@@ -28,7 +33,6 @@ bool loadAttrs(const QString fileName,QComboBox* cbNameG,QComboBox* cbNameN,QCom
     if ( file.open(QIODevice::ReadOnly ) ) {
         QTextStream stream( &file );
         QString line;
-        int i = 1;
         while ( !stream.atEnd() ) {
             line = stream.readLine(); // line of text excluding '\n'
            if(line.left(1)==":")
@@ -76,23 +80,23 @@ char* graph_reader( char * str, int num, FILE * stream ) //helper function to lo
 {
     if (num==0)
        return str;
-    char* ptr;
-    int l=0;
-    CFrmSettings* s=reinterpret_cast<CFrmSettings*>(stream); //as ugly as it gets :)
-    if(s->cur >=strlen(s->graphData.toUtf8().constData()))
+    const char* ptr;
+    char* optr;
+    char c;
+    int l;
+    rdr_t* s = (rdr_t*)stream;
+    if(s->cur >= s->len)
        return NULL;
-    strcpy(str,(char*)s->graphData.mid(s->cur,num-1).toUtf8().constData());
-    ptr = strchr(str,'\n');
-    if (ptr) {
-       ptr++;
-       *ptr = '\0';
-       l = ptr - str;
-    }
-    else
-       l=strlen (str);
+    l = 0;
+    ptr = s->data + s->cur;
+    optr = str;
+    do {
+       *optr++ = c = *ptr++;
+       l++;
+    } while (c && (c != '\n') && (l < num-1));
+    *optr = '\0';
     s->cur += l;
     return str;
-
 }
 
 
@@ -238,7 +242,6 @@ QString CFrmSettings::buildOutputFile(QString _fileName)
 void CFrmSettings::addAttribute(QString _scope,QString _name,QString _value){}
 bool CFrmSettings::loadGraph(MdiChild* m)
 {
-    cur=0;
     if(graph)
        agclose(graph);
     graphData.clear();
@@ -249,6 +252,7 @@ bool CFrmSettings::loadGraph(MdiChild* m)
 }
 bool CFrmSettings::createLayout()
 {
+    rdr_t rdr;
     //first attach attributes to graph
     int _pos=graphData.indexOf(tr("{"));
     graphData.replace(_pos,1,"{"+WIDGET(QTextEdit,teAttributes)->toPlainText());
@@ -257,8 +261,12 @@ bool CFrmSettings::createLayout()
        * If known, might want to use real name
        */
     agsetfile("<gvedit>");
-    cur=0;
-    graph=agread_usergets(reinterpret_cast<FILE*>(this),(gets_f)graph_reader);
+    QByteArray bytes = graphData.toUtf8();
+    rdr.data = bytes.constData();
+    rdr.len = strlen(rdr.data);
+    rdr.cur = 0;
+    graph = agread_usergets((FILE*)&rdr,(gets_f)graph_reader);
+    /* graph=agread_usergets(reinterpret_cast<FILE*>(this),(gets_f)graph_reader); */
     if(!graph)
        return false;
     Agraph_t* G=this->graph;
index 18b13e2a4af708702f636f520698360d49260b36..99d68414b4696e40571d9d32fd3783f5020db3dc 100644 (file)
@@ -26,8 +26,6 @@ class MdiChild;
 
 #include "gvc.h"
 
-
-
 class CFrmSettings : public QDialog
 {
         Q_OBJECT
@@ -35,7 +33,6 @@ public:
     CFrmSettings();
     int runSettings(MdiChild* m);
     int showSettings(MdiChild* m);
-    int cur;
     int drawGraph();
     MdiChild* getActiveWindow();
     QString graphData;
@@ -73,8 +70,6 @@ private:
     bool loadGraph(MdiChild* m);
     bool createLayout();
     bool renderLayout();
-
-
 };
 
 #endif