rpms/zinnia/F-13 always-store-data-in-little-endian-format.patch, NONE, 1.1 zinnia.spec, 1.4, 1.5
Peng Wu
pwu at fedoraproject.org
Fri Jul 16 08:43:47 UTC 2010
Author: pwu
Update of /cvs/pkgs/rpms/zinnia/F-13
In directory cvs01.phx2.fedoraproject.org:/tmp/cvs-serv11898
Modified Files:
zinnia.spec
Added Files:
always-store-data-in-little-endian-format.patch
Log Message:
* Fri Jul 16 2010 Peng Wu <pwu at redhat.com> - 0.06-6
- revert patch always-store-data-in-little-endian-format.patch for ppc build.
always-store-data-in-little-endian-format.patch:
configure.in | 5 +++++
recognizer.cpp | 24 ++++++++++++++++++++++--
trainer.cpp | 49 +++++++++++++++++++++++++++++++++++++------------
3 files changed, 64 insertions(+), 14 deletions(-)
--- NEW FILE always-store-data-in-little-endian-format.patch ---
>From 09f01b0afcb4408af2e1af0294425eac420cd7a5 Mon Sep 17 00:00:00 2001
From: Peng Huang <shawn.p.huang at gmail.com>
Date: Fri, 23 Apr 2010 16:09:07 +0800
Subject: [PATCH] Always store data in little endian format
---
configure.in | 5 +++++
recognizer.cpp | 24 ++++++++++++++++++++++--
trainer.cpp | 48 +++++++++++++++++++++++++++++++++++++-----------
3 files changed, 64 insertions(+), 13 deletions(-)
diff --git a/configure.in b/configure.in
index 2731d36..f25c83a 100644
--- a/configure.in
+++ b/configure.in
@@ -14,6 +14,11 @@ AC_PROG_LIBTOOL
dnl Checks for libraries.
+dnl Checks endian
+AC_C_BIGENDIAN([], [
+ AC_DEFINE(WORDS_LITENDIAN, 1, [Define if target is little endian])
+])
+
dnl Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS(string.h stdlib.h unistd.h fcntl.h \
diff --git a/recognizer.cpp b/recognizer.cpp
index b4d292a..b231607 100644
--- a/recognizer.cpp
+++ b/recognizer.cpp
@@ -5,6 +5,9 @@
//
// Copyright(C) 2008 Taku Kudo <taku at chasen.org>
//
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
#include <iostream>
#include <vector>
#include <cmath>
@@ -23,11 +26,28 @@ static inline char *read_ptr(char **ptr, size_t size) {
return r;
}
-template <class T>
-static inline void read_static(char **ptr, T *value) {
+template <typename T>
+inline void read_static(char **ptr, T *value) {
char *r = read_ptr(ptr, sizeof(T));
memcpy(value, r, sizeof(T));
}
+
+#ifndef WORDS_LITENDIAN
+template <>
+inline void read_static<unsigned int>(char **ptr, unsigned int *value) {
+ unsigned char *buf = reinterpret_cast<unsigned char *>(*ptr);
+ *value = (buf[0]) | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
+ *ptr += 4;
+}
+
+template <>
+inline void read_static<float>(char **ptr, float *value) {
+ unsigned int x;
+ read_static<unsigned int>(ptr, &x);
+ memcpy(value, &x, sizeof(x));
+}
+#endif
+
}
namespace zinnia {
diff --git a/trainer.cpp b/trainer.cpp
index 287a882..e150760 100644
--- a/trainer.cpp
+++ b/trainer.cpp
@@ -243,6 +243,31 @@ bool Trainer::makeHeader(const char *text_filename,
return true;
}
+template<typename T>
+inline void write_static(std::ofstream & bofs, const T value)
+{
+ bofs.write(reinterpret_cast<const char *>(&value), sizeof(T));
+}
+
+#ifndef WORDS_LITENDIAN
+template<>
+inline void write_static<unsigned int>(std::ofstream & bofs, const unsigned int value)
+{
+ bofs.put ((value) & 0xff);
+ bofs.put ((value >> 8) & 0xff);
+ bofs.put ((value >> 16) & 0xff);
+ bofs.put ((value >> 24) & 0xff);
+}
+
+template<>
+inline void write_static<float>(std::ofstream & bofs, const float value)
+{
+ unsigned int x;
+ memcpy(&x, &value, sizeof(x));
+ write_static<unsigned int>(bofs, x);
+}
+#endif
+
bool Trainer::convert(const char *text_filename,
const char *binary_filename,
double compression_threshold) {
@@ -261,9 +286,9 @@ bool Trainer::convert(const char *text_filename,
unsigned int magic = 0;
const unsigned int version = DIC_VERSION;
unsigned int msize = 0;
- bofs.write(reinterpret_cast<const char *>(&magic), sizeof(magic));
- bofs.write(reinterpret_cast<const char *>(&version), sizeof(version));
- bofs.write(reinterpret_cast<const char *>(&msize), sizeof(msize));
+ write_static<unsigned int> (bofs, magic);
+ write_static<unsigned int> (bofs, version);
+ write_static<unsigned int> (bofs, msize);
std::string line;
const size_t array_size = 8192 * 16;
@@ -277,19 +302,19 @@ bool Trainer::convert(const char *text_filename,
char character[16];
std::strncpy(character, col[0], sizeof(character));
bofs.write(character, sizeof(character));
- bofs.write(reinterpret_cast<const char *>(&bias), sizeof(bias));
+ write_static<float> (bofs, bias);
for (size_t i = 2; i < size; i += 2) {
const int index = std::atoi(col[i]);
const float value = std::atof(col[i + 1]);
if (fabs(value) > compression_threshold) {
- bofs.write(reinterpret_cast<const char *>(&index), sizeof(index));
- bofs.write(reinterpret_cast<const char *>(&value), sizeof(value));
+ write_static<int> (bofs, index);
+ write_static<float> (bofs, value);
}
}
const int index = -1;
const float value = 0.0;
- bofs.write(reinterpret_cast<const char *>(&index), sizeof(index));
- bofs.write(reinterpret_cast<const char *>(&value), sizeof(value));
+ write_static<int> (bofs, index);
+ write_static<float> (bofs, value);
++msize;
}
@@ -297,9 +322,10 @@ bool Trainer::convert(const char *text_filename,
bofs.seekp(0);
magic ^= DIC_MAGIC_ID;
bofs.seekp(0);
- bofs.write(reinterpret_cast<const char *>(&magic), sizeof(magic));
- bofs.write(reinterpret_cast<const char *>(&version), sizeof(version));
- bofs.write(reinterpret_cast<const char *>(&msize), sizeof(msize));
+
+ write_static<unsigned int> (bofs, magic);
+ write_static<unsigned int> (bofs, version);
+ write_static<unsigned int> (bofs, msize);
return true;
}
--
1.7.0.1
Index: zinnia.spec
===================================================================
RCS file: /cvs/pkgs/rpms/zinnia/F-13/zinnia.spec,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -p -r1.4 -r1.5
--- zinnia.spec 8 Jun 2010 07:32:34 -0000 1.4
+++ zinnia.spec 16 Jul 2010 08:43:47 -0000 1.5
@@ -5,7 +5,7 @@
Name: zinnia
Version: 0.06
-Release: 5%{?dist}
+Release: 6%{?dist}
Summary: Online handwriting recognition system with machine learning
Group: System Environment/Libraries
@@ -16,6 +16,7 @@ Source1: http://zinnia.svn.source
Source2: Makefile.tomoe
Patch0: zinnia-0.05-bindings.patch
Patch1: zinnia-0.06-fixes-ppc-float.patch
+Patch2: always-store-data-in-little-endian-format.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires: db4-devel, python2-devel
BuildRequires: perl(ExtUtils::MakeMaker)
@@ -92,6 +93,7 @@ This package contains tomoe model files
%setup -q -n %{name}-%{version}
%patch0 -p1 -b .bindings
%patch1 -p1 -b .ppc
+%patch2 -p1 -R -b .little-endian
find . -type f -name ChangeLog -size 0c -exec rm -f {} ';'
find . -type f -name "*.pyc" -exec rm -f {} ';'
cp %{SOURCE1} .
@@ -191,6 +193,9 @@ rm -rf $RPM_BUILD_ROOT
%{_datadir}/zinnia/model/tomoe/handwriting-zh_CN.model
%changelog
+* Fri Jul 16 2010 Peng Wu <pwu at redhat.com> - 0.06-6
+- revert patch always-store-data-in-little-endian-format.patch for ppc build.
+
* Tue Jun 08 2010 Liang Suilong <liangsuilong at gmail.com> - 0.06-5
- Force to use default compiling macro
More information about the scm-commits
mailing list